Python 如何认为 2 个对象不相等且不相同,但具有相同的 id?
How can 2 objects be considered not equal and not identicial by Python, but have the same id?
这个代码片段真让我费解:
class O(object):
pass
O() == O() # False
O() is O() # False
hash(O()) == hash(O()) # True !
id(O()) == id(O()) # True !!!
我一直认为 is
运算符正在比较 id
s,并且默认实例相等性检查 (==
) 也比较 id
s,或者在至少 hash
es:
2 个 class 实例如何共享相同的 id
,但在任何方面都不相等??
我正在使用 CPython 2.7.6。
答案在this question.
在 CPython 中,id
returns 存储数据的指针。
在您的示例中,GC 正在删除比较之前的旧对象。第二个对象放置在第一个对象所在的位置,因此为 id
.
返回相同的值
他们没有 "share the same id"。在 CPython(最常用的实现)中,id
函数 returns 作为参数给出的 Python 对象的内存地址。发生的事情是对象被垃圾收集,内存被重新使用。 id
s 只保证对同时存在的对象是唯一的。如果将对象绑定到名称,您会得到更合理的结果:
>>> class O(object):
... pass
...
>>> o1 = O() ; o2 = O()
>>> o1 == o2
False
>>> o1 is o2
False
>>> hash(o1) == hash(o2)
False
>>> id(o1) == id(o2)
False
这个代码片段真让我费解:
class O(object):
pass
O() == O() # False
O() is O() # False
hash(O()) == hash(O()) # True !
id(O()) == id(O()) # True !!!
我一直认为 is
运算符正在比较 id
s,并且默认实例相等性检查 (==
) 也比较 id
s,或者在至少 hash
es:
2 个 class 实例如何共享相同的 id
,但在任何方面都不相等??
我正在使用 CPython 2.7.6。
答案在this question.
在 CPython 中,id
returns 存储数据的指针。
在您的示例中,GC 正在删除比较之前的旧对象。第二个对象放置在第一个对象所在的位置,因此为 id
.
他们没有 "share the same id"。在 CPython(最常用的实现)中,id
函数 returns 作为参数给出的 Python 对象的内存地址。发生的事情是对象被垃圾收集,内存被重新使用。 id
s 只保证对同时存在的对象是唯一的。如果将对象绑定到名称,您会得到更合理的结果:
>>> class O(object):
... pass
...
>>> o1 = O() ; o2 = O()
>>> o1 == o2
False
>>> o1 is o2
False
>>> hash(o1) == hash(o2)
False
>>> id(o1) == id(o2)
False