易变对象解释有趣模式的python:id()?

2024-05-29 03:58:06 发布

您现在位置:Python中文网/ 问答频道 /正文

当调用具有相等值的可变对象的标识时,将出现以下模式。 如您所见,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上

特别要注意的是,最后一个值等于前面三次调用返回的值。在


Tags: 对象代码id模式amd64标识机制兴趣
2条回答

身份证立即重复使用

Python对您创建的所有对象使用相同的id

>>> for x in range(10):
        print(id([1, 2]))
4479841736
4479841736
4479841736
4479841736
4479841736
4479841736
4479841736
4479841736
4479841736
4479841736

因为没有对创建的列表的引用,它将被立即垃圾回收,并且id将被重用。在

重复使用相同的名字

将列表分配给名称obj,将使列表保持活动状态,直到将新列表分配给相同的名称:

^{pr2}$

在第二次迭代中,obj存在,obj = [1, 2]首先创建新列表,然后分配给obj。分配后,旧列表将被垃圾回收,id将再次可用以供重用。在下面的每个迭代中重复此操作。在

保留参考资料

在列表中保留对所有已创建列表的引用时:

>>> objs = []
>>> for x in range(10):
        obj = [1, 2]
        print(id(obj))
        objs.append(obj)
4480011848
4483963144
4486916488
4486914376
4486914568
4486916616
4486914824
4486915016
4486915272
4486915464

Python必须对它们使用不同的id。在

翻译效果

在标准交互式提示(Python 3.5.1)下,我可以生成以下内容:

>>> id([1, 2])
4330529608
>>> id([1, 2])
4330529608
>>> id([1, 2])
4330529608
>>> id([1, 2])
4330529608
>>> id([1, 2])
4330529608
>>> id([1, 2])
4330529608

但在IPython或IPython笔记本上工作时,你会发现:

In [1]: id([1, 2])
Out[1]: 4359684552

In [2]: id([1, 2])
Out[2]: 4379935816

In [3]: id([1, 2])
Out[3]: 4373482696

In [4]: id([1, 2])
Out[4]: 4359674248

In [5]: id([1, 2])
Out[5]: 4373482696

这是因为IPython在后台做了更多的工作,并在创建新对象之前创建了重用释放的id的对象。在

引自the docs(重点是我的):

id(object)

Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.

CPython implementation detail: This is the address of the object in memory.

基本上,当您编写id([1, 2])时,您将创建一个列表,检查它的id,并将其丢弃,这使它有资格进行垃圾回收。在CPython中,由于按引用计数的垃圾回收,它会被删除,并且没有任何东西禁止在内存中完全相同的位置创建另一个对象,因此,使用相同的id。在

相关问题 更多 >

    热门问题