Python中使用双层for循环遍历map对象为何无法重复迭代?
问题判断
你的猜测完全正确,输出不符合预期的本质确实是迭代位置没有回到起始点。
根本原因
你代码里的numbers是map()函数返回的迭代器对象,迭代器属于一次性消耗的遍历对象:
- 迭代器内部会维护当前的遍历位置,每次调用
next()取值后位置就会后移,遍历结束后不会自动重置 - 外层循环第一次取
numone时,已经消耗了迭代器的第一个元素2,此时迭代器的指针指向了下一个元素3 - 内层循环第一次遍历
numbers时,从指针当前位置3开始一直取到9,这也是你输出里没有2*2=4的原因,遍历结束后迭代器已经被完全消耗为空 - 外层循环尝试取下一个
numone时,迭代器已经没有剩余元素,整个循环直接终止,所以最终只输出了第一轮内层循环的结果
修复方案
把map返回的迭代器转为可以重复遍历的列表即可,列表属于可迭代对象,每次被遍历时都会自动从第一个元素开始:
numbers = list(map(int,range(2,10))) for numone in numbers: for numtwo in numbers: print('{0}*{1}={2}'.format(numone,numtwo,numone*numtwo))
修改后内层循环每次都会从2开始迭代,就能输出完整的2-9乘法表。
内容的提问来源于stack exchange,提问作者이종연
相关产品推荐
相关产品推荐

