这段代码真的让我很困惑:
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