当我们通过索引访问列表的元素时,CPython 会做什么?

What does CPython do when we access an element of the list by index?

能否请您解释一下当我们通过索引访问列表元素时在后台执行的过程?

我对C的了解很有限,所以我不能完全理解源代码。到目前为止,我已将 this 函数声明确定为相关声明。

根据this文章,我的理解是列表是指针数组。创建列表后,列表结构包含长度和通常大于大小的分配内存。但是,我不明白以下内容:

当我们访问一个元素时,我们是否使用列表的长度?或者我们只是访问指针 ob_item[i]?

following 问题没有回答这个问题,因为它只涉及列表实现。

C 不检查索引,我假设 CPython 也不检查。这意味着当您尝试访问列表中的元素时,系统会假定索引没有越界。这意味着由程序员使用列表的长度来执行这些检查。在您提供的代码中,有一个函数 valid_index(...) 可以执行此操作。

Python 使用您正在编制索引的列表的长度来检查索引是否超出范围。它不需要实际索引步骤的长度,但 C 没有任何保护来防止超出数组末尾的索引,因此首先检查长度很重要。

值得注意的是,您链接的函数 不是 从 Python 代码实现索引的函数。相反,它是一个 C API 函数,主要供其他 C 代码使用。当您从 Python 代码索引列表时实际调用的函数称为 list_subscript,您可以看到 further down the source code. That function handles negative indexes (and slices) and then calls another function to do the actual indexing. For integer indexes, it calls list_item,这与更通用的 PyList_GetItem 几乎相同正在查看(PyList_GetItem 包括一项检查,确认正在调用的对象实际上是一个列表)。