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

问题描述 投票:0回答:1

我创建了一个带有两个空方法的虚拟类:

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

当我创建

foo
类的实例
Foo
时,为什么
id(foo.bar) == id(foo.baz)
为 True,即使 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)

这两个方法的 id 不再相等:

>>> foo = Foo()
>>> is2(foo.bar, foo.baz)
False
python python-3.x identity
1个回答
2
投票

方法是根据需要重新创建的包装器。每次引用

foo.baz
都会创建一个 new 方法对象。

接下来,内存位置可以被重用;

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

通过执行

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

当您在不同的行上测试方法时,内存位置不相等,这与它们在相等测试中相等一样是巧合。两者都不是给定的。其他对象是在解释器中的不同阶段创建的,并且最终可能会在创建下一个方法对象之前重用内存位置,例如

© www.soinside.com 2019 - 2024. All rights reserved.