Python如何认为两个对象不相等且不相同,但具有相同的id?
这段代码片段让我很困惑:Python如何认为两个对象不相等且不相同,但具有相同的id?,python,object,hash,equality,Python,Object,Hash,Equality,这段代码片段让我很困惑: class O(object): pass O() == O() # False O() is O() # False hash(O()) == hash(O()) # True ! id(O()) == id(O()) # True !!! 我一直认为is操作符在比较ids,而默认的实例相等性检查(=)也比较ids,或者至少比较哈希es: 两个类实例如何共享相同的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,或者至少比较哈希
es:
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
我相信,您应该指出,在某些情况下,当人们认为创建了一个新对象时,Python会隐式地重用一个对象(例如整数),例如
a=0;b=0;id(a)==id(b)
returnTrue
。对某些小值整数的特殊处理是CPython实现的具体细节,但与此问题无关。另外,代码id(a)==id(b)
完全等同于a是b
——事实上,这就是定义