python - Python3 中的列表索引是如何工作的?
问题描述
假设我们有
a = [1, 2, 3]
每当我在列表中使用索引时0
,1
在2
这种情况下,python3 如何通过知道索引来检索元素?除了索引之外,引擎盖下的列表中的每个元素是否有任何特定地址?
解决方案
数组(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中对我的第一个回答,如果有帮助,请投票。谢谢你。
推荐阅读
- arrays - SwiftUI:将字符串数组放入单个文本中,数组的每个第二个成员都有偏移
- cypress - Cypres 函数 TYPE 关闭上一个条目
- visual-studio - 未显示 xaml 设计器或预览器
- java - Java AWS 开发工具包 S3。按元数据查找对象
- javascript - JavaScript中let变量的提升
- html - 如何使容器缩小以适应其内容?(例如,缩略图的包装画廊)
- java - 原始 java 代码在 Spark 中究竟执行在哪里?
- security - 如果任何其他所有者授予所有者访问 GCP 中其他一些帐户的权限,我会收到通知吗?
- azure - 如何将 Twillio Voice 与 Azure Bot Service 连接?
- python - 从python中的列表中提取数据