我想了解的是为什么以下代码
for x, y in [1,2], [3,4]:
print(x, y, x + y)
版画
1 2 3
3 4 7
代替
1 3 4
2 4 6
现在,我知道zip工作和not using zip to iterate over a pair of lists could be considered an anti-pattern,但我仍然需要对此默认行为进行解释 .
从我的角度来看,上面的代码应该像内置的zip函数一样直观地工作
for (x, y) in zip([1,2], [3,4]):
print(x, y, x + y)
打印
1 3 4
2 4 6
从内存中我记得很久以前就看过这种技术的解释了(我猜_16774已经完成了搜索,包括整篇Python 3文档的第5部分,但我找不到任何关于这种行为的解释,甚至没有找到section 5.6. (Looping Techniques) .
这是第4次Gotcha吗?
3 回答
理解第一种行为的直观方式是思考
作为分解
哪里
我认为这是预期的行为!
考虑
[1,2], [3,4]
是一个元组文字,相当于元组([1,2], [3,4])
. (您可能在没有注意的情况下使用它,例如在使用a, b, c = 10, 20, 30
分配多个值时忽略()
...) .因此,在您的示例中,循环遍历此列表,如下所示:
这现在更有意义了吗?
考虑zip:如果zip会做同样的事情,那么我'd be suspicious! How is there this very common and considered-useful but completely redundant thing lying around? Hasn'吨有人注意到了吗?所以你不应该指望他们这样做! ;-)
看这个:
结果是不同的,所以当你迭代时:
它会是这样的:
当循环是:
它迭代如下:
这就是Python创建
zip
方法的原因 .