如何让Python迭代器相互独立、不产生交互?
问题解决:实现独立状态的字符串迭代器
问题根源
你的代码中__iter__方法直接返回实例自身,导致所有通过iter()获取的迭代器共享同一个_ix状态变量。当调用next(iter1)后,_ix被修改为1,后续next(iter2)会基于这个已修改的索引取值,最终引发多个迭代器互相干扰的问题。
解决方案
方案一:拆分容器与迭代器类
将原类拆分为容器类和独立的迭代器类,每次调用iter()时返回全新的迭代器实例,确保每个迭代器拥有独立的状态:
class MyStringIterator: def __init__(self, s): self.s = s self._ix = 0 def __next__(self): try: item = self.s[self._ix] except IndexError: raise StopIteration self._ix += 1 return item class MyString: def __init__(self, s): self.s = s def __iter__(self): # 每次调用iter()都生成新的迭代器实例 return MyStringIterator(self.s) string = MyString('abcd') iter1 = iter(string) iter2 = iter(string) print(next(iter1)) # 输出 'a' print(next(iter2)) # 输出 'a'
方案二:利用生成器简化实现
Python生成器天然具备独立迭代状态,且遍历结束后会自动抛出StopIteration,代码更简洁:
class MyString: def __init__(self, s): self.s = s def __iter__(self): for char in self.s: yield char string = MyString('abcd') iter1 = iter(string) iter2 = iter(string) print(next(iter1)) # 输出 'a' print(next(iter2)) # 输出 'a'
两种方案均满足你的两项要求:__next__方法(生成器自动实现)会在遍历结束时抛出StopIteration,同时多个迭代器的状态完全独立,不会互相影响。
内容的提问来源于stack exchange,提问作者user20200095
相关产品推荐
相关产品推荐

