Python迭代器底层运行原理解析:list_iterator是否引用原内存列表对象?
Python列表迭代器底层实现逻辑解答
核心问题答复
- 迭代器对原列表的引用关系
list迭代器会直接持有原列表的强引用,不会额外拷贝列表的完整数据。你可以通过代码验证这个逻辑:创建迭代器后修改原列表对应位置的元素,调用next()返回的就是修改后的结果:L = [1000, 2202, 3456] it = iter(L) L[0] = 999 print(next(it)) # 输出为999,和原列表修改后的值一致 next()方法的运行逻辑
调用next()时并不是直接移动物理内存指针读取数据,而是迭代器内部维护了一个独立的索引计数器,运行规则如下:- 迭代器初始化时,计数器默认值为0
- 每次调用
next(),首先会对比计数器和当前原列表的总长度:如果计数器小于列表长度,就返回原列表对应索引位置的元素引用,同时计数器自增1 - 如果计数器等于列表长度,就抛出
StopIteration异常,迭代终止
补充说明:Python列表本身的存储结构是连续的指针数组,数组中每个位置存的都是对应元素对象的内存引用,而非元素本身的实际数据。迭代器取元素的本质,就是用内部计数器作为下标,去列表的指针数组中取出对应位置的元素引用返回。
你也可以通过修改列表长度的测试验证逻辑:迭代过程中删除列表末尾元素,迭代器会提前终止,因为它每次取长度都是读当前原列表的实时长度:L = [1,2,3,4] it = iter(L) next(it) # 返回1,计数器变为1 L.pop() # 列表长度变为3 next(it) # 返回2,计数器变为2 next(it) # 返回3,计数器变为3 next(it) # 抛出StopIteration,不会读取原列表原本的第4个元素
内容的提问来源于stack exchange,提问作者Jason Taylor
相关产品推荐
相关产品推荐

