列表索引在Python3中如何工作?

时间:2019-02-14 10:39:06

标签: python python-3.x list indexing

假设我们有

  

a = [1、2、3]

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

1 个答案:

答案 0 :(得分:2)

从技术上讲,数组(在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个字节

memory representation of array of pointers

希望这件事对您有帮助。 这是我在stackoverflow中的第一个答案,如果有帮助,请投票。谢谢。