【问题标题】:What exactly is id() displaying?id() 到底显示了什么?
【发布时间】:2018-12-13 02:21:55
【问题描述】:

id() 函数似乎用于识别值,而不是对象。 下面哪个实体实际上是一个对象: x ? 11 ? 12 ?

id(对象) 返回对象的“身份”。这是一个整数(或长整数),保证该对象在其生命周期内是唯一且恒定的。具有不重叠生命周期的两个对象可能具有相同的 id() 值。

$ python
Python 2.7.5 (default, May  3 2017, 07:55:04)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-14)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> id(11)
11311992
>>> x=11
>>> id(x)
11311992
>>> id(12)
11311968
>>> x=12
>>> id(x)
11311968

【问题讨论】:

  • “值,而不是对象” 嗯?值是对象。
  • 1112 是这里的对象。 x 不是一个对象,它是一个包含对象引用的变量。

标签: python


【解决方案1】:

id 确实唯一标识了活动对象(如:如果id(a) == id(b),则a is b == True,如果id(a) != id(b)a is b == False)。您看到的行为(11 的不相关“实例”实际上是同一个对象)来自 CPython 的实现细节。

在 CPython 中,文字 11 将始终返回相同的对象,就像 an interned cache for numbers from -5 to 256 一样。尝试使用 257 编写代码,您会发现每次都会得到不同的 ids - 除非您将它们写在同一个表达式中,因为在这种情况下,有一个优化可以为您提供相同的对象。

不过,这表明调查不可变对象的身份几乎毫无意义 - 具有相同值的两个不可变对象实际上可能是也可能不是同一个对象,具体取决于缓存/优化,您只是不应该关心你的代码。对于不可变对象,您应该关心的只是它们的值。

【讨论】:

    【解决方案2】:

    id() 返回对象的 ID,但听起来您使用“值”一词来描述 Python 所指的对象。在 Python 中,“对象”有一个特殊的含义——一切都是对象。 (换句话说,对于任何xisinstance(x, object) 都是真的。)

    例如1112 都是对象:

    >>> isinstance(11, object)
    True
    

    有关更多详细信息,您可能想查看this answer(或者它可能只是令人困惑——它肯定让我感到困惑!)

    【讨论】:

      猜你喜欢
      • 2013-12-09
      • 2014-10-18
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 2011-12-10
      相关资源
      最近更新 更多