python对象上可重复的id冲突
我知道python内置的python对象上可重复的id冲突,python,Python,我知道python内置的id()返回一个在对象生命周期内唯一的id。据我所知,生命周期不重叠的对象最终可能具有相同的ID。但是,我试图理解这种相当混乱的行为: >>> id(matplotlib.image.BboxImage.set_cmap) 4424372944 >>> id(numpy.ma.core.MaskedArray.sum) 4424372944 事实上,在多个解释器实例中,行为是可重复的: Mac:~$ python2.7 -c "imp
id()
返回一个在对象生命周期内唯一的id。据我所知,生命周期不重叠的对象最终可能具有相同的ID。但是,我试图理解这种相当混乱的行为:
>>> id(matplotlib.image.BboxImage.set_cmap)
4424372944
>>> id(numpy.ma.core.MaskedArray.sum)
4424372944
事实上,在多个解释器实例中,行为是可重复的:
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)"
4343186208 4343186208
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)"
4521153312 4521153312
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)"
4358591264 4358591264
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)"
4389970720 4389970720
似乎matplotlib.image.BboxImage.set_cmap
和numpy.ma.core.MaskedArray.sum
始终彼此获得相同的ID,即使在python解释器的不同安装中也是如此
现在我了解到,这与id()
的文档是一致的,因为这两个对象在访问时是动态创建的,因此它们的生命周期确实不重叠。但是为什么这两个不相关的对象总是以相同的ID结束呢
(这个问题不同于,因为这里我要问的是,为什么这可以在多个解释器实例之间重复,而不仅仅是在生命周期不重叠的对象上出现虚假的id冲突。)这适用于任何实例方法,这是您正在测试的两个对象的类型。每次访问描述符时,都会实例化一个新的instancemethod
对象。由于您没有保存对新创建的方法的引用,因此只要id
返回,它就有资格进行垃圾收集,并且它显然是在下次调用id
之前被收集的,因此可以重用相同的内存位置
这种行为可以用另一种方式来看待:
>>> x = matplotlib.image.BboxImage.set_cmap
>>> y = matplotlib.image.BboxImage.set_cmap
>>> id(x) == id(y)
False
x
和y
是对两个不同对象的引用,因为每次引用set\u cmap
都会创建一个新的instancemethod
对象