两个对象如何被Python认为不相等且不相同,但具有相同的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:

  • x is y为真当且仅当x和y是同一对象

  • 如果没有定义__cmp__(), __eq__()__ne__()操作,则通过对象标识(" address ")比较类实例

两个类实例如何共享相同的id,但不以任何方式相等??

我使用的是CPython 2.7.6

答案就在这个问题里。

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

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

它们不"共享相同的id"。在CPython(最常用的实现)中,id函数返回作为参数给出的Python对象的内存地址。实际情况是,对象被垃圾收集,内存被重用。id仅对同时存在的对象保证唯一。如果您将对象绑定到名称,您将得到更合理的结果:

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

最新更新