识别对象,为什么id(...)返回的值会发生变化?

时间:2010-08-04 04:51:20

标签: python

  

ID(对象)

     

这是一个整数(或长整数),在该生命周期内,该对象保证是唯一且常量的。

你能解释一下这个输出吗?为什么j的ID会发生变化?

>>> i=10  
>>> id(i)  
6337824  
>>> j=10  
>>> id(j)  
6337824  
>>> j=j+1  
>>> id(j)  
6337800  
>>> id(i)  
6337824  

7 个答案:

答案 0 :(得分:31)

因为整数是不可变的,所以每个整数值都是具有唯一id的独特对象。整数10具有与11不同的ID。执行j=j+1不会更改现有整数对象的值,而是将j更改为指向11的对象。

查看我们独立创建新变量k时会发生什么,并为其指定值11

>>> j=10
>>> id(j)
8402204
>>> j=j+1
>>> id(j)
8402192
>>> k=11
>>> id(k)
8402192

请注意,并非总是每个整数都有一个且只有一个对应的对象。这只适用于Python决定缓存的小整数。大整数不会发生这种情况:

>>> x = 123456789
>>> id(x)
8404568
>>> y = 123456789
>>> id(y)
8404604

请参阅https://docs.python.org/3/c-api/long.html#c.PyLong_FromLong

  

当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用。

答案 1 :(得分:11)

这就是2**8 is 2**8 == True2**9 is 2**9 == False

的原因

预先分配-5到256之间的值。

答案 2 :(得分:2)

不同变量的id是Python创建变量的产物。

id是内存中对象位置的哈希值。 Python变量是对象的引用,而不是新对象。如果多个变量引用同一个对象,它们具有相同的`id。

答案 3 :(得分:1)

在CPython中,id通常来自Py_Object的指针值,即它在内存中的位置。

答案 4 :(得分:1)

Python缓存不可变对象(读取整数和元组...) - 这就是它们不可变的原因 并且如果你在许多中引用相同的不可变,则节省内存 地方。所以small整数,空元组等都是实际的 缓存在Python运行时中,因此您可以继续获取相同的对象 因此同样的身份。

尝试使用此列表,您没有获得相同的ID。

答案 5 :(得分:0)

这些是原始类型,所以我猜每个值都有自己的ID。尝试创建一个真正的对象,我想你会看到你期望的功能。

如果您需要基元的id,则可以创建一个只包含该类型的一个成员的对象。

答案 6 :(得分:0)

j的ID更改,因为j指定的对象发生了更改。首先,您将j初始化为10,因此当您致电id(j)时,您会获得10的ID。然后,您将j设置为11,因此在您致电id(j)后,您将获得11的ID。