这段代码实在让我感到困惑:
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
s {1}} ES:
2个类实例如何共享相同的id
,但不能以任何方式相同?
我正在使用CPython 2.7.6。
答案 0 :(得分:5)
答案 1 :(得分:4)
他们没有“共享相同的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