我试图同时循环两个列表,当它们的大小不同时没有意识到太麻烦。
然而,在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循环来缩短我的代码,但后来我意识到由于多种原因这是一个坏主意。
答案 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]):
,其中第一个in
是for ... 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)