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

14 投票
8 回答
10716 浏览
提问于 2025-04-16 02:17

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。比如,整数 1011 的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。当你在这个范围内创建一个整数时,实际上你得到的是对已有对象的引用。

撰写回答