【问题标题】:How can 2 objects be considered not equal and not identicial by Python, but have the same id?Python如何认为2个对象不相等且不相同,但具有相同的ID?
【发布时间】:2015-11-16 05:09:38
【问题描述】:

这段代码sn-p真让我费解:

class O(object):
    pass
O() == O()             # False
O() is O()             # False
hash(O()) == hash(O()) # True !
id(O()) == id(O())     # True !!!

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

2 个类实例如何共享相同的id,但在任何方面都不相等??

我正在使用 CPython 2.7.6。

【问题讨论】:

    标签: python object hash equality


    【解决方案1】:

    他们不会“共享相同的 id”。在 CPython(最常用的实现)中,id 函数返回作为参数给出的 Python 对象的内存地址。正在发生的事情是对象正在被垃圾收集,并且内存正在被重新使用。 ids 只保证同时存在的对象是唯一的。如果将对象绑定到名称,您会得到更合理的结果:

    >>> 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.
    • 对某些小值整数的特殊处理是 CPython 实现的特定细节,但与此问题无关。另外,代码id(a) == id(b)完全等同于a is b - 事实上,这就是定义
    【解决方案2】:

    答案在this question

    在 CPython 中,id 返回存储数据的指针。

    在您的示例中,GC 在比较之前删除了旧对象。第二个对象放置在第一个对象的位置,因此为id 返回相同的值。

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2022-01-14
      相关资源
      最近更新 更多