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 运算符正在比较 ids,并且默认实例相等性检查 (==) 也比较 ids,或者在至少 hashes:

2 个 class 实例如何共享相同的 id,但在任何方面都不相等??

我正在使用 CPython 2.7.6。

答案在this question.

在 CPython 中,id returns 存储数据的指针。

在您的示例中,GC 正在删除比较之前的旧对象。第二个对象放置在第一个对象所在的位置,因此为 id.

返回相同的值

他们没有 "share the same id"。在 CPython(最常用的实现)中,id 函数 returns 作为参数给出的 Python 对象的内存地址。发生的事情是对象被垃圾收集,内存被重新使用。 ids 只保证对同时存在的对象是唯一的。如果将对象绑定到名称,您会得到更合理的结果:

>>> 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