识别对象,为什么从id(…)返回的值改变?

ID(对象)

这是一个整数(或长整数),在整个生命周期中保证它是唯一的,并且是常量。

你能解释这个输出吗? 为什么j的id改变了?

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

由于整数是不可变的,每个整数值是一个唯一的ID不同的对象。 整数1011不同。 做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。