假设我们有
a = [1、2、3]
在这种情况下,每当我在0
,1
,2
之类的列表中使用索引时,python3如何通过知道索引来检索元素?除了索引之外,幕后列表中每个元素是否都有特定的地址?
答案 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中的第一个答案,如果有帮助,请投票。谢谢。