python - 为什么python dict的id不变?
问题描述
我们有一个像这样的字典:
a = dict()
然后我们插入项目,例如:
for i in range(10**10):
a[i] = 0
id(a)
即使字典太大而无法重新分配内存,为什么仍然保持不变?
解决方案
让我们首先引用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
引用的对象的生命周期内保持唯一a
b
现在,您问题中有趣的部分是您想知道为什么即使您向字典中插入新项目,id
of也没有改变。a
要了解,即使底层内存对象最终会在被调用(此处__setitem__
为底层 cpython 实现)并以特定增长率调整大小时,您也需要注意,文档提供的语句将在对象生命周期内保持不变,并且id 将是唯一的。id
推荐阅读
- google-app-maker - 如何在 appmaker 中禁用表单的所有元素而不为每个元素编写代码?
- python - 如何从 python 中的多个进程获取返回值?
- c++ - 从 Web URL 下载内容
- python - glDrawArrays 的问题
- html - 如何在导航栏中输入下拉项
- java - 使用外部 jar 和多个参数从 python 执行 java 类
- angular - 如何在 Angular Material 中设置 Dropdwnlist 值
- python - if not: 和 if False 之间的区别:
- sql-server - SQL Server 添加变量
- c# - 为 widget.RecyclerView 更改 RecyclerView MvvmCross