【问题标题】:Identity comparisons of two object() [duplicate]两个对象()的身份比较[重复]
【发布时间】:2019-10-21 18:00:44
【问题描述】:

docs 中的身份比较描述了is 表达式的结果取决于对象身份。

运算符isis not 测试对象的身份:当且仅当xy 是同一个对象时,x is y 为真。使用id() 函数确定对象的身份。 x is not y 产生逆真值。

但下面的代码显示了不同的结果。

id(object()) == id(object())  # True
object() is object() # False

object() is object() 结果必须是 True 由于文档描述。

【问题讨论】:

  • 这不是了解正在发生的事情的好方法。首先将它们存储为变量。 object() 这里是什么?
  • 调用object()意味着你正在调用构造函数来调用object;所以基本上,您正在比较同一类的两个不同实例。检查obj = object(); another = obj; obj is another
  • ID 被重复使用。您没有保留对对象的任何引用,并且 ID 在它们被放弃后变得可用。在第一个测试中,创建了两个对象,它们不同时存在,并且被赋予相同的 ID。在第二个测试中,直接比较了两个对象,因此它们确实同时存在(并且确实具有不同的 ID)。

标签: python


【解决方案1】:

调用object构造函数(我的意思是object()),每次分配并构造一个新的object实例,并带有新的available id在当前范围内。

a = object()
b = object()

id(a) == id(b)    # False
a is b            # False

Python 垃圾收集器,一旦对象变得不可用(例如超出范围、解构对象等)就收集对象并释放分配的内存。因此,它们的 id 将可用于将来构建的下一个对象。

所以在sn-p下面,

object() is object()            # False
id(object()) == id(object())    # True

在第一行,同时创建两个对象进行比较,然后由垃圾收集器收集。因此,它们有不同的 id,它们也不相同。

在第 2 行,创建第一个对象并提取它的 id 进行比较,然后将其解构(导致垃圾收集器收集)。第二个对象使用第一个可用的id,这是刚刚从第一个对象收集的id。所以他们有相同的id

【讨论】:

  • 如何解释id(object())==id(object())True
  • @bereal 正如 khelwood 所说,第一个对象是在比较完成之前收集的垃圾。因此,现在释放的内存位置被重新用于第二个对象,导致它们具有相同的 id。请参阅in the docs:“[...] 具有非重叠生命周期的两个对象可能具有相同的id() 值。”
  • @bereal 我在回答中添加了更多描述。让我们检查一下...
猜你喜欢
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多