51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1537|回复: 1

[在学] 不可变对象值相同时为什么地址不同?

[复制链接]

该用户从未签到

发表于 2019-1-31 11:20:23 | 显示全部楼层 |阅读模式
在实践过程中发现不可变对象int 和tuple对象值相同但是地址不同,不可变对象不是值相同地址应该相同的吗?
微信截图_20190131111125.png


在学课程:
征服Python3-快速突击班
http://www.atstudy.com/course/1003
回复

使用道具 举报

该用户从未签到

发表于 2019-1-31 11:30:23 | 显示全部楼层
[color=rgba(0, 0, 0, 0.56)]在python一切皆是对象,而对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用赋值给变量,所以会有如下情况
[color=rgba(0, 0, 0, 0.56)]>>> a=345
>>> b = a
>>> a is b
True
[color=rgba(0, 0, 0, 0.56)]---------------------------------------------------------------------------------------------------------------------------------
[color=rgba(0, 0, 0, 0.56)]创建了两个不同的对象,虽然值相同
[color=rgba(0, 0, 0, 0.56)]>>> a = 999
>>> b = 999
>>> id(a)
49335248
>>> id(b)
49335360
[color=rgba(0, 0, 0, 0.56)]------------------------------------------------------------------------------------------------------------------------------------
[color=rgba(0, 0, 0, 0.56)]但有一个特例,对于小整数[-5, 256]。考虑到小整数可能频繁使用,出于性能考虑,Python使用小整数对象缓冲池缓存了[-5, 256]之间的整数,该范围内的整数在Python系统中是共享的。
[color=rgba(0, 0, 0, 0.56)]>>> x = 256
>>> y = 256
>>> id(x)
1391325952
>>> id(y)
1391325952

[color=rgba(0, 0, 0, 0.56)]>>> x = -5
>>> y = -5
>>> id(x)
1391321776
>>> id(y)
1391321776
[color=rgba(0, 0, 0, 0.56)]所以是同一个对象

[color=rgba(0, 0, 0, 0.56)]元组属于复合数据类型,不适合缓冲池,所以你里面一个元素python会当作普通的整数来处理,当然它其实还是一个元组,只不过python的处理机制是那样而已;
[color=rgba(0, 0, 0, 0.56)]至于python数据处理的机制,会涉及较多的内存细节等概念,如果不是特别清楚,或者比较迷茫,建议同学要学会探索哦,本身程序设计就需要一种持续探索和创新的思维,鉴于语言机制等有些涉及到底层的东西比较陌生,那么我们就首先掌握好大众的,普遍的,对于特殊处理的,可以通过自己查阅相关资料,总结得出结果

回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-19 08:34 , Processed in 0.071440 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表