Python 对生成器进行zip操作再循环遍历时易出现的bug
楼主前几天有一个需求,大概的代码如下:
a = [0,1,2,3,4]
b = [5,6,7,8,9]
c = (x for x in range(10))
for _a, _c in zip(c,a):
print(_a,_c)
for _b,_c in zip(c,b):
print(_b,_c)
楼主最初的想法是,该程序的输出为:
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
然而,程序的输出为:
0 0
1 1
2 2
3 3
4 4
6 5
7 6
8 7
9 8
经过猜想以后,认为这是生成器惹的锅。在第一个循环中,因为c的元素个数比a多,所以在a的元素循环完毕后,c仍然有元素进行遍历。因此,在输出4 4后,将再次进入循环,又因为c的顺序在a前面,因此程序还不会出现StopIteration,故c的元素会再消耗一个,再对a进行取值时出现Stop异常进而跳出循环。
那么正确的写法也很简单,将元素较多的生成器放在元素较少的生成器之后即可。
a = [0,1,2,3,4]
b = [5,6,7,8,9]
c = (x for x in range(10))
for _a, _c in zip(a,c):
print(_a,_c)
for _b,_c in zip(b,c):
print(_b,_c)
其输出即为:
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9