Iterator模式问题:自定义Python迭代器输出无限重复序列如何解决?
解决Python Iterator类无限重复输出的问题
问题根源
- 你在
__next__方法里用了yield,这会让该方法返回生成器对象,而非迭代器要求的单个元素。当for循环迭代DummyList实例时,每次调用__next__都会拿到一个新的生成器;遍历完这个生成器的所有元素后,for循环会再次调用__next__获取新生成器,如此反复就导致了无限重复输出。 - 每次调用
__next__都重新创建列表[1,2,3,4,5],没有维护迭代的位置状态,根本没法触发迭代终止的逻辑。
解决方案1:正确实现Iterator接口
继承Iterator时,需要维护一个索引状态,每次__next__返回单个元素,元素耗尽时抛出StopIteration异常来终止迭代:
from collections.abc import Iterator class DummyList(Iterator): def __init__(self): self.data = [1, 2, 3, 4, 5] self.index = 0 # 记录当前迭代的位置 def __next__(self) -> int: if self.index >= len(self.data): raise StopIteration # 迭代终止信号 value = self.data[self.index] self.index += 1 return value
测试代码:
dl = DummyList() for i in dl: print(i)
输出结果符合预期:
1 2 3 4 5
解决方案2:实现可迭代对象(更简洁常用)
如果不需要严格继承Iterator,可以让类实现__iter__方法并返回生成器,这是Python中更常用的写法:
class DummyList: def __iter__(self): data = [1, 2, 3, 4, 5] for i in data: yield i
用同样的测试代码运行,会得到和预期一致的输出,且生成器迭代完毕后会自动终止,不会出现无限循环。
内容的提问来源于stack exchange,提问作者Tlaloc-ES
相关产品推荐
相关产品推荐

