识别对象,为什么从id(…)返回的值改变?
ID(对象)
这是一个整数(或长整数),在整个生命周期中保证它是唯一的,并且是常量。
你能解释这个输出吗? 为什么j
的id改变了?
>>> i=10 >>> id(i) 6337824 >>> j=10 >>> id(j) 6337824 >>> j=j+1 >>> id(j) 6337800 >>> id(i) 6337824
由于整数是不可变的,每个整数值是一个唯一的ID不同的对象。 整数10
与11
不同。 做j=j+1
不会改变现有的整数对象的值,而是改变j
指向11
的对象。
看看当我们独立创build一个新的variablesk
并给它赋值11
时会发生什么:
>>> j=10 >>> id(j) 8402204 >>> j=j+1 >>> id(j) 8402192 >>> k=11 >>> id(k) 8402192
请注意,并非所有的整数都只有一个对应的对象。 这只发生在Python决定caching的小整数上。 对于大整数不会发生:
>>> x = 123456789 >>> id(x) 8404568 >>> y = 123456789 >>> id(y) 8404604
请参阅http://docs.python.org/c-api/int.html#PyInt_FromLong :
当前的实现为-5到256之间的所有整数保留一个整数对象数组,当你在那个范围内创build一个int时,你实际上只是返回一个对现有对象的引用。
这就是为什么2**8 is 2**8 == True
,而2**9 is 2**9 == False
。
-5到256之间的值是预先分配的。
不同variables的相同id
是Python创buildvariables的产物。
id
是内存中对象位置的散列。 Pythonvariables是对象的引用 ,而不是新对象。 如果几个variables引用相同的对象,它们具有相同的id。
在CPython中, id
通常是从Py_Object
的指针值派生的,也就是它在内存中的位置。
Pythoncaching不可变的对象(读取整数和元组..) – 这就是为什么它们是不可变的,并保存内存,如果你在许多地方引用相同的不可变的。 所以, small
整数,空元组等实际上caching在Python运行时,所以你不断找回相同的对象,因此相同的ID。
尝试这个清单,你不会得到相同的ID。
这些是原始types,所以我猜测每个值都有自己的ID。 尝试创build一个真正的对象,我想你会看到你期望的function。
如果你需要一个原始的id,你可以创build一个对象只有一个types的成员。
j
的id因为j
命名的对象而改变。 首先将j
初始化为10,所以当你调用id(j)
你得到10
的id。 然后你把j
设置为11,所以当你打电话给id(j)
你得到了11
的id。