当调用具有相等值的可变对象的标识时,将出现以下模式。
如您所见,id(mutObj)
返回的值并不完全独立于id(mutObj)
之前的返回值,但模式是不稳定的。在
这种行为对于Python代码本身来说可能无关紧要,尽管如此,我还是很有兴趣了解底层机制!在
>>> id([1,2])
6706248
>>> id([1,2])
59597256
>>> id([1,2])
56866632
>>> id([1,2])
56866632
>>> id([1,2])
56881992
>>> id([1,2])
56881992
>>> id([1,2])
56879624
>>> id([1,2])
56867784
>>> id([1,2])
56867784
>>> id([1,2])
56879624
python3.4.3[MSC v.1600 64位(AMD64)]在win32上
特别要注意的是,最后一个值等于前面三次调用返回的值。在
身份证立即重复使用
Python对您创建的所有对象使用相同的
id
:因为没有对创建的列表的引用,它将被立即垃圾回收,并且
id
将被重用。在重复使用相同的名字
将列表分配给名称
^{pr2}$obj
,将使列表保持活动状态,直到将新列表分配给相同的名称:在第二次迭代中,
obj
存在,obj = [1, 2]
首先创建新列表,然后分配给obj
。分配后,旧列表将被垃圾回收,id
将再次可用以供重用。在下面的每个迭代中重复此操作。在保留参考资料
在列表中保留对所有已创建列表的引用时:
Python必须对它们使用不同的
id
。在翻译效果
在标准交互式提示(Python 3.5.1)下,我可以生成以下内容:
但在IPython或IPython笔记本上工作时,你会发现:
这是因为IPython在后台做了更多的工作,并在创建新对象之前创建了重用释放的
id
的对象。在引自the docs(重点是我的):
基本上,当您编写
id([1, 2])
时,您将创建一个列表,检查它的id
,并将其丢弃,这使它有资格进行垃圾回收。在CPython中,由于按引用计数的垃圾回收,它会被删除,并且没有任何东西禁止在内存中完全相同的位置创建另一个对象,因此,使用相同的id
。在相关问题 更多 >
编程相关推荐