嵌套迭代中for与while循环处理生成器的差异及for循环实现方案
循环结果差异原因
Python的for循环迭代迭代器时,会在循环启动前预先获取目标迭代器的固定引用,循环全程都只会使用这个初始引用对应的迭代器,你在循环体内部对princ_iter变量重新赋值,不会影响for循环已经持有的迭代器实例。
你代码中调用tee(princ_iter)后,原始传入tee的迭代器就不应该再被使用,否则会出现元素消耗冲突:嵌套迭代nested_iter时会推进原始迭代器的指针,而for循环还在继续迭代这个已经被推进的原始迭代器,就会出现元素跳过、顺序错乱的问题。
而while循环不存在预先持有迭代器引用的问题,每次都是主动调用next(princ_iter)获取下一个值,你在循环体内部将princ_iter赋值为tee生成的新迭代器,下一次next调用会直接使用新的迭代器,状态完全可控,所以输出符合预期。
for循环的实现方案
如果需要用for循环实现相同逻辑,可以用无限迭代器充当循环外壳,每次手动从当前主迭代器取值,修改后的代码如下:
from itertools import count, tee princ_iter = count(3) # 用count()做无限循环外壳,不直接迭代主迭代器 for _ in count(): x = next(princ_iter) print("testing ", x, "...") if x % 3 == 0: print("Testing passed!") print(" Starting subtest:") princ_iter, nested_iter = tee(princ_iter) for y in nested_iter: print(" Sub-testing", y, " with ", x) if y % (x//2) == 0: print(" Sub-testing passed!") break
内容的提问来源于stack exchange,提问作者Ohibò
相关产品推荐
相关产品推荐

