【问题标题】:Repeatable id clashes on python objects [duplicate]python对象上的可重复ID冲突[重复]
【发布时间】: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_cmapnumpy.ma.core.MaskedArray.sum 总是得到相同的ID,即使是在不同的python 解释器中。

现在我明白这与id() 的文档是一致的,因为这两个对象是在访问时动态创建的,因此确实具有不重叠的生命周期。但是为什么这两个不相关的对象总是以相同的 ID 结束呢?

(这个问题与Object methods of same class have same id? 不同,因为我在这里问的是为什么这在多个解释器实例中是可重复的,而不是简单地在具有非重叠生命周期的对象上发生虚假的 id 冲突。)

【问题讨论】:

    标签: python


    【解决方案1】:

    any 实例方法也是如此,这是您正在测试的两个对象的类型。每次访问描述符时,都会实例化一个新的 instancemethod 对象。由于您没有保存对新创建的方法的引用,因此只要id 返回,它就有资格进行垃圾收集,并且显然在下次调用id 之前正在收集它,因此可以使用相同的内存位置重复使用。

    这种行为可以通过另一种方式看到:

    >>> x = matplotlib.image.BboxImage.set_cmap
    >>> y = matplotlib.image.BboxImage.set_cmap
    >>> id(x) == id(y)
    False
    

    xy 是对两个不同对象的引用,因为每次引用 set_cmap 都会创建一个新的 instancemethod 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多