奇怪的 id() 行为;不同的 ID,但 id(x) == id(y) returns 是吗?
Weird id() behaviour; different ids, yet id(x) == id(y) returns True?
我用两个空方法创建了一个虚拟 class:
class Foo:
def bar(self):
pass
def baz(self):
pass
当我为我的 Foo
class 创建一个实例 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
方法是根据需要重新创建的包装器。每次引用 foo.baz
都会创建一个 new 方法对象。
接下来,可以重用内存位置; id()
值仅在对象的生命周期内是唯一的。当不再需要该对象时(引用计数降为 0)Python 删除该对象并可以自由地重新使用相同的内存 space.
通过执行 id(foo.bar)
,新方法对象仅在 id()
调用期间存在。下一个 id(foo.baz)
调用可以自由重用该内存位置,并且您的 ==
相等性测试 returns 为真,纯粹是因为 Python 内存分配是经济的。
当您在不同的行上测试方法时,内存位置不相等,这与它们在相等性测试中相等是巧合。两者都不是给定的。其他对象是在不同阶段在解释器中创建的,并且可以在创建下一个方法对象之前重新使用内存位置,例如
我用两个空方法创建了一个虚拟 class:
class Foo:
def bar(self):
pass
def baz(self):
pass
当我为我的 Foo
class 创建一个实例 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
方法是根据需要重新创建的包装器。每次引用 foo.baz
都会创建一个 new 方法对象。
接下来,可以重用内存位置; id()
值仅在对象的生命周期内是唯一的。当不再需要该对象时(引用计数降为 0)Python 删除该对象并可以自由地重新使用相同的内存 space.
通过执行 id(foo.bar)
,新方法对象仅在 id()
调用期间存在。下一个 id(foo.baz)
调用可以自由重用该内存位置,并且您的 ==
相等性测试 returns 为真,纯粹是因为 Python 内存分配是经济的。
当您在不同的行上测试方法时,内存位置不相等,这与它们在相等性测试中相等是巧合。两者都不是给定的。其他对象是在不同阶段在解释器中创建的,并且可以在创建下一个方法对象之前重新使用内存位置,例如