ID(对象)
这是一个整数(或长整数),在该生命周期内,该对象保证是唯一且常量的。
你能解释一下这个输出吗?为什么j
的ID会发生变化?
>>> i=10
>>> id(i)
6337824
>>> j=10
>>> id(j)
6337824
>>> j=j+1
>>> id(j)
6337800
>>> id(i)
6337824
答案 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 == True
和2**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。