我试图同时循环遍历两个列表,当它们的大小不同时没有意识到太多的麻烦.
然而,虽然在IDLE中摆弄,我发现这非常奇怪的输出.
这是Python 3.3.2
>>> for i in [1,2,3], j in [4,5,6]: print(i, j) [1, 2, 3] 5 True 5
关于这一点很少,True有时会变为False,如下所示:
for i in [77,2,3], j in [588,7,6]: print(i, j) [77, 2, 3] 5 False 5
并且5总是保持5.
这适用于两个语句,但有三个语句,它给了我这个:
>>> for i in [1,2,3], j in [4,5,6], k in [7,8,9]: print(i, j, k) Traceback (most recent call last): File "", line 1, in for i in [1,2,3], j in [4,5,6], k in [7,8,9]: NameError: name 'k' is not defined
对我来说,这看起来很奇怪.
什么是5?真/假从何而来?为什么这样做......不是pythonic?您希望打印第一个代码:
1 4 2 5 3 6
编辑:我确实在脚本中有一个j = 5,在一个有效的for循环中.
第二次编辑:我其实并没有找 for i, j in zip(list1, list2)
我试图通过用一个替换两个for循环来缩短我的代码,但后来我意识到由于多种原因这是一个坏主意.
你必须j=5
在你的程序中定义这就是为什么你得到5作为输出,否则你的程序将引发NameError.
>>> for i in [1,2,3], j in [4,5,6]: print(i, j) ... Traceback (most recent call last): File "<ipython-input-1-b8d5b59be30b>", line 1, in <module> for i in [1,2,3], j in [4,5,6]: NameError: name 'j' is not defined >>> j = 5 >>> for i in [1,2,3], j in [4,5,6]: print(i, j) ... [1, 2, 3] 5 True 5
上面的循环相当于这两个:
>>> for i in ([1,2,3], j in [4,5,6]): print(i, j) ... [1, 2, 3] 5 True 5 >>> for i in ([1,2,3], True): print(i, j) ... [1, 2, 3] 5 True 5
请注意,for循环中使用的变量会在循环结束后自动分配给最后一个值,但仅限于正常循环中(在Python 2.x中,这也适用于List comprehensions):
>>> for m in range(5): print (m, end=' ') ... 0 1 2 3 4 >>> m 4
要获得预期的输出用途zip
:
>>> for x, y in zip([1,2,3],[4,5,6]): ... print (x, y) ... 1 4 2 5 3 6
for i in [1,2,3], j in [4,5,6]:
被解析为for i in ([1,2,3], j in [4,5,6]):
,其中第一个in
是for ... in
构造的一部分,第二个in
是成员资格测试运算符.显然,以前执行的一些代码设置j
为5并保持这种方式,所以自从j=5
进入后[4,5,6]
,这就成了for i in ([1,2,3], True):
.然后Python迭代这个两元素序列,设置i
为first [1,2,3]
然后True
,然后j
单独留下.在三语句版本中,会发生类似的解析,但由于k
尚未在循环之前分配值,因此会导致错误.