Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python对象上可重复的id冲突_Python - Fatal编程技术网

python对象上可重复的id冲突

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

我知道python内置的
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
对象