首页 > 解决方案 > Python3 中的列表索引是如何工作的?

问题描述

假设我们有

a = [1, 2, 3]

每当我在列表中使用索引时012这种情况下,python3 如何通过知道索引来检索元素?除了索引之外,引擎盖下的列表中的每个元素是否有任何特定地址?

标签: pythonpython-3.xlistindexing

解决方案


数组(python 中的列表)在技术上存储指针而不是对象本身,这允许数组仅包含特定大小的元素,即使在 python 中使用混合类型列表也是如此。

来自 python 文档:

CPython 的列表实际上是可变长度数组,而不是 Lisp 样式的链表。该实现使用对其他对象的连续引用数组,并将指向该数组的指针和数组的长度保存在列表头结构中。

这使得索引列表 a[i] 成为一种操作,其成本与列表的大小或索引的值无关。

当添加或插入项目时,引用数组的大小会调整。应用了一些巧妙的方法来提高重复追加项目的性能;当数组必须增长时,会分配一些额外的空间,因此接下来的几次不需要实际调整大小。

来源: https ://docs.python.org/3/faq/design.html#how-are-lists-implemented-in-cpython

更多解释:


什么是指针?

指针是存储内存地址的变量。指针用于存储其他变量或内存项的地址。

以及索引如何工作?

当 p 表示指向数组第一个元素的指针时,a[i] 的含义与 (p + i) 相同: *(a + i) 所以如果指针 p 指向数组的元素,则将 n 添加到指针使其指向原始元素之后的第 n 个元素。这涉及在对象之间以字节为单位添加或减去正确的偏移量(基于引用的大小)。

引用的大小与 CPU 的字大小相同 在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节

指针数组的内存表示

希望这对您来说清楚..这是我在stackoverflow中对我的第一个回答,如果有帮助,请投票。谢谢你。


推荐阅读