Python中zip参数顺序不同导致迭代器耗尽结果差异问题
运行结果差异原因解析
核心差异来自Python内置zip函数的两个设计特性:
- 迭代时会从左到右依次读取每个传入迭代器的下一个值
- 只要任意一个迭代器抛出
StopIteration(耗尽),就会立即终止迭代,不再执行后续取值操作
第一种写法:zip(ci, zip(ai, bi))的执行过程
先明确各迭代器的最大可迭代次数:ai、bi对应列表长度为3,所以内层zip(ai, bi)最多返回3组值,ci对应列表长度为4,最多返回4个值。
外层zip的每一轮迭代逻辑:
- 第1轮:先取
ci的下一个值 → 得到1,再取内层zip(ai, bi)的下一个值 → 得到(1,1),本轮迭代完成 - 第2轮:先取
ci的下一个值 → 得到2,再取内层zip(ai, bi)的下一个值 → 得到(2,2),本轮迭代完成 - 第3轮:先取
ci的下一个值 → 得到3,再取内层zip(ai, bi)的下一个值 → 得到(3,3),本轮迭代完成 - 第4轮:按顺序先取第一个迭代器
ci的下一个值 → 得到4,接着尝试取第二个迭代器(内层zip)的下一个值,此时内层zip已经耗尽,抛出StopIteration,外层zip直接终止迭代。
此时ci的所有值已经被全部取出,所以后续list(ci)返回空列表[]。
第二种写法:zip(zip(ai, bi), ci)的执行过程
外层zip迭代顺序调换后,每一轮先读取内层zip的取值:
- 第1-3轮:先取内层zip的值,再取
ci的值,和第一种写法逻辑一致,ci被取出1、2、3三个值 - 第4轮:按顺序先取第一个迭代器(内层zip)的下一个值,此时内层zip已经耗尽,直接抛出
StopIteration,外层zip立即终止,不会执行对ci的取值操作。
此时ci还剩4未被取出,所以后续list(ci)返回[4]。
内容的提问来源于stack exchange,提问作者GibberishConundrum
相关产品推荐
相关产品推荐

