You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:35:25