【发布时间】:2015-09-24 20:55:45
【问题描述】:
我知道 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 结束呢?
(这个问题与Object methods of same class have same id? 不同,因为我在这里问的是为什么这在多个解释器实例中是可重复的,而不是简单地在具有非重叠生命周期的对象上发生虚假的 id 冲突。)
【问题讨论】:
标签: python