首页 > 解决方案 > 为什么python dict的id不变?

问题描述

我们有一个像这样的字典:

a = dict()

然后我们插入项目,例如:

for i in range(10**10):
    a[i] = 0

id(a)即使字典太大而无法重新分配内存,为什么仍然保持不变?

标签: python

解决方案


让我们首先引用python 文档中关于 id 内置函数的说明:

id(object) 返回对象的“身份”。这是一个整数,保证该对象在其生命周期内是唯一且恒定的。具有非重叠生命周期的两个对象可能具有相同的 id() 值。

CPython 实现细节:这是对象在内存中的地址。

要了解您的代码段:

a = dict()
for i in range(10**10):
    a[i] = 0 

您首先需要了解 line 发生了什么a = dict(),在这种情况下,您创建一个新的 python 字典对象并将其分配给变量a,此时如果我们参考文档部分谈论id在对象的整个生命周期中保持唯一性,那么一切应该是有道理的。例如,假设我们有这个:

a = dict()
print(id(a))
a = dict() # New object
print(id(a))

上面你可以清楚地看到 id(a) 应该如何改变,这主要是因为第二个分配给的对象a不一样。另一个例子:

a = dict() # id1
b = dict() # id2
a = b      # id2

同样的事情,你已经创建了 2 个 dict 对象,并且在第三个 assignmenta=b中,id(a)will be ,它将在 vars和id2引用的对象的生命周期内保持唯一ab

现在,您问题中有趣的部分是您想知道为什么即使您向字典中插入新项目,idof也没有改变。a要了解,即使底层内存对象最终会在被调用(此处__setitem__为底层 cpython 实现)并以特定增长率调整大小时,您也需要注意,文档提供的语句将在对象生命周期内保持不变,并且id 将是唯一的。id


推荐阅读