迭代器与数组的区别是什么?为何Python迭代器遍历判重代码运行失败?
迭代器与数组的核心区别及代码问题解答
1. 迭代器(iterator)和数组(array)的核心区别
- 本质不同:数组是存储容器,会在内存中连续存储所有元素,支持通过下标随机访问任意位置的元素,数据永久保留直到被主动删除。迭代器是遍历工具,本身不存储元素,仅记录当前遍历的位置,只能按顺序单向获取下一个元素,无法回退也无法随机访问其他位置的元素。
- 遍历特性不同:数组支持任意次数的重复遍历,每次遍历都可以从头开始。迭代器是一次性消耗品,遍历结束后就为空,无法重复使用,必须重新生成新的迭代器实例才能再次遍历。
- 内存特性不同:数组需要提前加载所有元素到内存,占用内存大小和元素数量正相关。迭代器采用惰性计算逻辑,每次仅加载当前需要处理的元素,理论上可以处理无限长度的序列而不会出现内存溢出问题。
2. 第一版代码运行不符合预期的原因
首先第一版代码本身的逻辑就存在错误,和是否使用迭代器没有直接关系:
你写的双层循环没有区分「同一个位置的元素」和「不同位置值相等的元素」,外层循环第一次拿到的i是序列的第一个元素,内层循环第一次拿到的j也是序列的第一个元素,二者值必然相等,所以函数会在第一次判断就直接返回False,这就是你测试所有输入都会直接输出1\n1\nFalse的核心原因。
补充说明:Python中的列表是可迭代对象,不是迭代器,每次执行for x in 列表的时候都会生成一个新的迭代器从头遍历,所以你第一版代码用列表作为参数测试的时候,内层循环才能拿到第一个元素触发相等判断。
如果传入第一版函数的data是真正的迭代器而不是数组(列表),会有更严重的遍历问题:迭代器是一次性消耗品,外层循环取第一个i的时候已经消耗了迭代器的第一个元素,内层循环遍历迭代器的时候会直接从第二个元素开始取,等内层循环跑完,整个迭代器已经被完全消耗为空,外层循环直接终止,连后续的元素都不会遍历到。
你第二版用range生成下标的代码逻辑是正确的:外层从第二个元素开始遍历,内层仅遍历当前元素之前的所有元素,不会出现自己和自己比较的情况,同时数组支持通过下标随机访问元素,不会出现遍历消耗的问题,所以可以正常运行。
内容的提问来源于stack exchange,提问作者MR Li
相关产品推荐
相关产品推荐

