id()到底显示什么?

时间:2018-07-04 15:36:40

标签: python id

出现了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

2 个答案:

答案 0 :(得分: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尝试您的代码,您会看到每次都会得到不同的id-除非您使用相同的表达式编写它们,否则在这种情况下,有一种优化将为您提供相同的对象。 / p>

这仍然表明,调查不可变对象的身份几乎没有意义-取决于缓存/优化,两个具有相同值的不可变对象实际上可能不是同一对象,而您根本不需要关心您的代码。对于不可变的对象,您只需要关心它们的值即可。

答案 1 :(得分:0)

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

例如1112都是对象:

>>> isinstance(11, object)
True

有关更多详细信息,您可能想看看this answer(否则可能会令人困惑–这肯定使我感到困惑!)