CPython通过索引访问列表元素时的底层执行流程是怎样的?
CPython 通过索引访问列表元素的底层执行流程
首先明确核心结论:列表索引访问一定会用到列表存储的长度属性,不会直接读取ob_item[i]指针,所有内存访问都会先经过合法性校验。
具体执行流程按先后顺序如下:
- 第一步:参数类型校验
首先会校验传入的索引是否为整型,如果是其他类型会直接抛出TypeError,不进入后续流程。 - 第二步:索引合法性校验(核心用到列表长度属性的环节)
列表结构体中存储的ob_size属性是当前列表实际存储的有效元素个数,和预分配的内存总大小无关,这一步的所有判断都基于该属性:- 若为负索引,会先执行转换逻辑:
实际索引 = 传入的负索引 + ob_size - 校验转换后的正索引范围是否满足
0 <= 实际索引 < ob_size,如果不满足直接抛出IndexError,不会执行任何内存访问操作
- 若为负索引,会先执行转换逻辑:
- 第三步:合法索引下的元素读取
只有校验通过后,才会访问列表的ob_item指针数组,通过ob_item[实际索引]取到对应Python对象的指针,作为结果返回。
补充说明:列表预分配的内存是预留的扩容空间,超出
ob_size的位置没有存储有效元素,直接访问这些位置会触发不可预期的内存错误,因此长度校验是索引访问过程中不可跳过的必要环节。
内容的提问来源于stack exchange,提问作者Daria
相关产品推荐
相关产品推荐

