这里发生了什么? Python for循环有多个in

时间:2013-11-28 19:04:05

标签: python for-loop

我试图同时循环两个列表,当它们的大小不同时没有意识到太麻烦。

然而,在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 "<pyshell#53>", line 1, in <module>
    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循环来缩短我的代码,但后来我意识到由于多种原因这是一个坏主意。

4 个答案:

答案 0 :(得分:6)

你必须在你的程序中定义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

答案 1 :(得分:5)

for i in [1,2,3], j in [4,5,6]:被解析为for i in ([1,2,3], j in [4,5,6]):,其中第一个infor ... in构造的一部分,第二个in是成员资格测试运算符。显然,之前执行的一些代码将j设置为5并保持这种方式,因此j=5位于[4,5,6],因此变为for i in ([1,2,3], True):。然后Python迭代这个两元素序列,将i设置为第一个[1,2,3]然后设置True,并将j单独设置。在三语句版本中,会发生类似的解析,但由于k尚未在循环之前分配值,因此会导致错误。

答案 2 :(得分:0)

j等于5
所以

for i in [1,2,3], j in [4,5,6]:
        print(i, j)

表示

for (i in [1,2,3], (j in [4,5,6])):
        print(i, j) 

i[1,2,3]更改为(j in [4,5,6])的结果 j始终为5

你得到了

[1, 2, 3] 5  -> i = [1, 2, 3],      j = 5
True 5       -> i = (j in [4,5,6]), j = 5

答案 3 :(得分:0)

可能你想要的是

for (i, j) in zip([1, 2, 3], [4, 5, 6]):
    print (i, j)