识别对象,为什么id(...)返回的值会变化?
id(object)
这个是一个整数(或者长整数),它保证在这个对象的整个生命周期内是唯一的,并且不会改变。
你能解释一下这个输出吗?为什么j
的id会改变呢?
>>> i=10
>>> id(i)
6337824
>>> j=10
>>> id(j)
6337824
>>> j=j+1
>>> id(j)
6337800
>>> id(i)
6337824
8 个回答
2
不同变量使用相同的 id
是因为 Python 创建变量的方式。
id
是对象在内存中位置的一个哈希值。Python 的变量其实是指向一个对象的 引用,而不是新的对象。如果多个变量指向同一个对象,它们的 id
就会相同。
16
这就是为什么 2**8 是 2**8 == True
,而 2**9 是 2**9 == False
。
在 -5 到 256 之间的数值是提前分配好的。
35
因为整数是不可变的,所以每个整数值都是一个独特的对象,并且每个对象都有一个独特的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。当你在这个范围内创建一个整数时,实际上你得到的是对已有对象的引用。