【问题标题】:Comparison between two objects in Python + IDLE using the id () function with different result [duplicate]在Python + IDLE中使用id()函数比较两个对象的结果不同[重复]
【发布时间】:2017-03-07 16:52:44
【问题描述】:

搜索时,我注意到id() 函数返回一个整数,并保证该对象是唯一且恒定的。

当比较两个不同的对象得到结果时,这可能会导致这些不同的结果??

我在电子书中看到一个例子,比较 id(Car()) == id (Car()) 返回 False 但运行相同的代码时返回 True

类 Car.py

class Car:
    pass

空闲代码

>>> from Car import Car
>>> ferrari = Car()
>>> lamborghini = Car()
>>> id(lamborghini) == id(ferrari)
False
>>> id(Car()) == id(Car())
True

https://docs.python.org/3/library/functions.html#id

【问题讨论】:

  • id(object()) == id(object()) 是否不是真正的 Python 问题。这取决于实现以及它是否 a) 立即销毁不需要的对象和 b) 为下一个对象重用最后释放的空间。至少某些版本的 CPython 至少对某些对象类执行此操作。 id() 的主要用途是测试实现的细节。

标签: python python-3.x


【解决方案1】:

任何对象的id 都应该是唯一的,所以看起来id(Car()) == id(Car()) 应该是False,但它的评估结果是True。但是,对象的id 只能保证在该对象的生命周期内是唯一的。由于这些Car 对象是暂时的,它们只持续足够长的时间才能传递给id(),然后它们被垃圾收集。 Python 正在评估== 的一侧,进行垃圾收集,然后评估另一侧。在此过程中,id 被每个 Car() 对象重用。

更多解释见abarnert's answerWhy is the id of a Python class not unique when called quickly?

【讨论】:

    【解决方案2】:

    如果你想知道为什么id(ferrari) == id(lamborghini) 是假的,而id(Car()) == id(Car()) 是真的。这是因为当您说ferrari = Car() 时,Python 会基于 Car 结构生成一个新对象。所以ferrari 是一个新对象,只有ferrari 的唯一ID。

    id(Car()) == id(Car()) 中,真正的评估来自Car 对象不在id() 调用之外的事实。

    我希望这会有所帮助!

    【讨论】:

    • 您忽略了问题的第二部分,这就是为什么id(Car()) == id(Car()) 评估为True
    • id(Car()) == id(Car()) 都指同一个 Car 类。如果我有一张带说明的纸,每次我指向它时,它总是同一张纸。但是,如果我用那些纸质说明来制造 2 辆汽车。它们将是不同的对象,即使它们是使用带有说明的同一张纸制成的。
    • 只是补充一点。在此语句中 id(Car()) == id(Car()) 创建了两个 Car 对象。它们不需要分配给任何名称即可作为对象存在。如果代码是 id(Car) == id(Car) 但它是 id(Car()) == id(Car()),你的解释是正确的。
    • 射击,你是对的,我添加的评论太快了。 Car() 实例化了一个 Car 对象,因此真正的评估来自于它们不在 id() 调用之外的事实。
    • “Car() 实例化了一个 Car 对象,因此真正的评估来自于它们不在 id() 调用之外的事实。”非常简洁的总结。将该信息添加到您的答案中,我会将我的反对票改为赞成票。
    【解决方案3】:

    来自文档:

    id(object):返回一个对象的“身份”。这是一个整数(或长整数),保证该对象在其生命周期内是唯一且恒定的。

    您正在创建类Car 的两个不同实例,即ferrarilamborghini,因此它们的标识符不同。

    【讨论】:

    • 你忽略了问题的第二部分,这就是为什么id(Car()) == id(Car()) 评估为True
    猜你喜欢
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2021-05-19
    • 2013-10-02
    相关资源
    最近更新 更多