【发布时间】:2019-07-08 08:42:35
【问题描述】:
假设我们有
a = [1, 2, 3]
在这种情况下,每当我在0、1、2 之类的列表中使用索引时,python3 如何通过知道索引来检索元素?除了索引之外,列表内的每个元素是否有任何特定地址?
【问题讨论】:
标签: python python-3.x list indexing
假设我们有
a = [1, 2, 3]
在这种情况下,每当我在0、1、2 之类的列表中使用索引时,python3 如何通过知道索引来检索元素?除了索引之外,列表内的每个元素是否有任何特定地址?
【问题讨论】:
标签: python python-3.x list indexing
数组(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中对我的第一个答案,如果有帮助,请投票。谢谢。
【讨论】: