为了账号安全,请及时绑定邮箱和手机立即绑定

python 中is 相当于比较两个对象的id,这个怎么解释

python 中is 相当于比较两个对象的id,这个怎么解释

茅侃侃 2019-05-20 18:27:16
defzhuangshi(cls):definner():passreturninnerclassA:passprint(zhuangshi(A)iszhuangshi(A))print(id(zhuangshi(A))==id(zhuangshi(A)))print(id(zhuangshi(A)))print(id(zhuangshi(A)))控制台输出结果如下:FalseTrue3166541631665416惊呆!为什么两个对象的内存地址都一样,为何is运行结果是false?
查看完整描述

2 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

楼上都没答到点子上,这个现象与gc有关,属于未定义行为。
事情是这样的:
执行zhuangshi(A)iszhuangshi(A)时,表达式从左到右求值,先运算第一个zhuangshi(A),并将返回值存在一个临时变量,假设为tmp1;再运算第二个,返回值存在tmp2。此时内存中实际上有两个inner的副本,各被一个引用tmp1tmp2指向,它们地址当然是不同的,因此is的结果为False。
再看第二个例子:
执行id(zhuangshi(A))==id(zhuangshi(A))时,表达式从左到右、从内向外求值。先运算zhuangshi(A),再将返回值传给id,最后我们得到一个整数。注意此处与上一个例子不同,此时已经没有任何指向inner的引用,因此垃圾回收器可以将其回收。待对第二个表达式求值时,有一定的概率Python会在先前的inner对象的地址上创建新的inner对象,从而导致两个地址相同。
总而言之,看上去它们是同一个对象,实际上它们是先后被创建在同一个地址上的两个不同对象,因此有相同的id。
                            
查看完整回答
反对 回复 2019-05-20
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

print(zhuangshi(A)iszhuangshi(A))等价于
a,b=zhuangshi(A),zhuangshi(A)
print(aisb)#False
print(id(a)==id(b))#False
print(id(zhuangshi(A))==id(zhuangshi(A)))等价于
a,b=id(zhuangshi(A)),id(zhuangshi(A))
print(a==b)#True两次id相同所以true
                            
查看完整回答
反对 回复 2019-05-20
  • 2 回答
  • 0 关注
  • 429 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信