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。
慕姐4208626
TA贡献1852条经验 获得超7个赞
print(zhuangshi(A)iszhuangshi(A))等价于a,b=zhuangshi(A),zhuangshi(A)print(aisb)#Falseprint(id(a)==id(b))#Falseprint(id(zhuangshi(A))==id(zhuangshi(A)))等价于a,b=id(zhuangshi(A)),id(zhuangshi(A))print(a==b)#True两次id相同所以true
添加回答
举报
0/150
提交
取消