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)
return
True
。对某些小值整数的特殊处理是CPython实现的具体细节,但与此问题无关。另外,代码
id(a)==id(b)
完全等同于
a是b
——事实上,这就是定义