奇怪的id()行为;不同的id,但id(x)== id(y)返回True?

时间:2015-07-30 16:31:21

标签: python python-3.x identity

我用两个空方法创建了一个虚拟类:

class Foo:
    def bar(self):
        pass
    def baz(self):
        pass

当我创建foo类的实例Foo时,为什么id(foo.bar) == id(foo.baz)为真,即使ID明显不同?

>>> foo = Foo()
>>> id(foo.bar)
31344648
>>> id(foo.baz)
35951432
>>> id(foo.bar) == id(foo.baz)
True

但是,使用这样的函数:

def is2(obj1, obj2):
    return id(obj1) == id(obj2)

这两种方法'不再相等:

>>> foo = Foo()
>>> is2(foo.bar, foo.baz)
False

1 个答案:

答案 0 :(得分:2)

方法是根据需要重新创建的包装器。每次引用foo.baz时,都会创建方法对象。

接下来,可以重复使用内存位置; id()值仅对于对象的生命周期是唯一的。当不再需要该对象时(引用计数降至0),Python将删除该对象,并可以自由地重用相同的内存空间。

通过执行id(foo.bar),新方法对象仅在id()调用期间存在。然后,下一个id(foo.baz)调用可以自由地重用该内存位置,并且您的==相等性测试返回true,这纯粹是因为Python在内存分配方面经济实惠。

当您在单独的行上测试方法时,内存位置不相同,这在同等性测试中是相同的。也不是给定的。其他对象在解释器中的不同阶段创建,并且最终可以在创建下一个方法对象之前重用内存位置,例如