Python 对多个非等长可迭代对象进行zip操作时易出现的bug

本文探讨了在Python中使用生成器与zip函数时容易遇到的bug,特别是在循环遍历时。通过具体示例,解释了为何生成器的顺序会影响最终结果,并提供了正确的代码实践。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值