python-3.x - 为什么python列表的id在追加操作后没有改变,如果它被实现为动态数组?
问题描述
如果将列表实现为动态数组,那么每次为数组创建新空间时,分配的大小都被完全占用,为什么id没有变化?
>>> a=[]
>>> id(a)
4395087184
>>> for i in range(1000):
a.append(i)
>>> id(a)
4395087184
解决方案
id
对象的保证在对象的生命周期内是持久的。因此,如果此列表发生更改,则将违反id
函数规范id
,并且您只创建了一个列表,因此没有两个具有不同id
s 的列表对象。
这在实践中的工作方式是列表对象本身保留在相同的内存位置,但它拥有对支持数组的(私有)引用。当阵列的容量需要更改时,会创建一个新的后备阵列并复制内容。列表对象的(私有)引用已更新为指向新的后备数组,但列表对象本身并未在内存中重新定位。
我已经写了一个更长的解释它是如何工作的,包括一个显示列表对象和支持数组的框和指针图的交互式示例。您可能会发现这有助于了解调整后备数组大小时内存中实际发生的情况。
推荐阅读
- c++ - C++ 中的自己的 Profiler 弄乱了函数的浮点返回值
- python - 如何使用 for 循环在我的模式之前和之后提取特定长度的字符串
- javascript - 如何在 nx 中使用/构建 oclif(CLI 节点应用程序)?
- ruby-on-rails-5 - Lazyload 不适用于 Turbolinks 页面刷新(但适用于正常页面刷新)
- ruby-on-rails - 如何删除rails中的会话?
- android - 如何使用 asyncTask 将以 base64 格式选择的多个图像发送到服务器?
- vb.net - ADODB.connection 上的最大同时连接?
- c# - 如何将 C# 对象保持在范围内,以便可以在整个程序中访问和更改值?
- django - 如何让Django找到一个静态css文件
- flutter - 如何防止滑块弄乱我的布局?