识别对象,为什么 id(...) 返回的值会改变?
- 2025-04-10 09:45:00
- admin 原创
- 20
问题描述:
id(对象)
这是一个整数(或长整数),保证在该对象的生命周期内是唯一的并且恒定的。
你能解释一下这个输出吗?为什么j
的 ID 会改变?
>>> i = 10
>>> id(i)
6337824
>>> j = 10
>>> id(j)
6337824
>>> j = j+1
>>> id(j)
6337800
>>> id(i)
6337824
这是否就像i
对象j
引用最初指向同一个对象,但是当j
发生变化时,它们开始引用不同的对象?
解决方案 1:
因为整数是不可变的,所以每个整数值都是具有唯一 id 的不同对象。整数10
具有与 不同的 id 11
。执行此操作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
请参阅Python/C API 参考手册中的PyLong_FromLong :
当前实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个整数时,实际上只是返回对现有对象的引用。
解决方案 2:
这就是为什么2**8 is 2**8 == True
,和2**9 is 2**9 == False
。
-5 至 256 之间的值是预先分配的。
解决方案 3:
不同变量的相同之处id
在于 Python 创建变量的方式。
id
是对象在内存中位置的哈希值。Python 变量是对对象的引用id
,而不是新对象。如果多个变量引用同一个对象,则它们具有相同的。
解决方案 4:
在 CPython 中,id
一般是从Py_Object
的指针值得出的,即它在内存中的位置。
解决方案 5:
j
的 id 会因为 命名的对象发生j
变化而变化。首先,您将其初始化j
为 10,因此当您调用 时,id(j)
您将获得 的 id 10
。然后您将其设置j
为 11,因此之后当您调用 时,id(j)
您将获得 的 id 11
。
解决方案 6:
事实是,每个对象(值)在 Python 中都有一个唯一的 id,例如对象'hello'
和'hi'
有自己的 id 或者10
和11
有另外 2 个不同的 id。另一件事是,每个变量只是一个特定对象(值)的标签。现在,当我们说时j=10
,对象的 id10
被分配给变量j
。然后当您更改j
(例如j=j+1
)的值时,j
将引用另一个对象。换句话说,j
将成为另一个对象的标签。因此,j
当其值改变时,的 id 也会变化。还有 Python 的缓存方法,这有助于提高效率。例如,当您编写j=10
并x=10
创建 2 个单独的对象时,它只会创建一个10
带有 2 个标签j
和的对象x
。
解决方案 7:
这些是原始类型,所以我猜每个值都有自己的 ID。尝试创建一个真正的对象,我想你会看到你期望的功能。
如果您需要一个原始类型的 id,那么您可以创建一个仅包含该类型的一个成员的对象。
扫码咨询,免费领取项目管理大礼包!