Python如何判断两个对象既不相等又不同一,但它们具有相同的id?

3
这段代码片段真的让我感到困惑:
class O(object):
    pass
O() == O()             # False
O() is O()             # False
hash(O()) == hash(O()) # True !
id(O()) == id(O())     # True !!!

我一直认为 is 运算符是在比较 id,而默认的实例相等检查 (==) 也是在比较 id,或者至少是在比较 hash

怎么可能两个类实例共享相同的 id,但却没有任何相似之处?

我正在使用 CPython 2.7.6。

2个回答

5
答案在这个问题中。
在CPython中,id返回存储数据的指针。
在您的示例中,GC在比较之前删除了旧对象。第二个对象被放置在第一个对象的位置,因此返回相同的id值。

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

我认为,你应该指出在某些情况下,Python会隐式地重用一个对象(例如整数),当我们可能认为会创建一个新的对象时,比如 a=0; b=0; id(a) == id(b) 返回 True - Eli Korvigo
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - holdenweb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接