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

2024-04-24 00:40:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

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

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

Tags: 实例方法selfidtruefoodefbar
1条回答
网友
1楼 · 发布于 2024-04-24 00:40:39

方法是按需重新创建的包装器。每次引用foo.baz时,都会创建一个新的方法对象。你知道吗

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

通过执行id(foo.bar),新方法对象只在id()调用期间有效。下一个id(foo.baz)调用可以自由地重用该内存位置,而您的==相等测试返回true,这纯粹是因为Python在内存分配方面是经济的。你知道吗

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

相关问题 更多 >