5

为什么这段代码是错误的?

for i,j in range(100),range(200,300):
    print i,j

当我测试这个 for 语句时,我看到了这个错误

ValueError:解包的值太多

但是当我测试时

for i, j in range(2),range(2):
     print i,j

每件事都是正确的!

4

3 回答 3

16

range(2)给出一个列表 [0, 1]. 因此,您i, j将从第一个列表中获取,然后从第二个列表中获取。

因此,您的循环类似于:-

for i, j in [0, 1], [0, 1]:
    print i, j

印刷: -

0 1
0 1

现在,如果你range(3)有,那么它将失败,因为,range(3)给出了一个 3 元素列表,它不能在two loop variables.

所以,你不能这样做: -

for (i, j) in [[0, 1, 2]]:
    print i, j

它会失败,给你你得到的错误。

尝试使用zip, 将两个列表压缩为一个。:-

>>> for (i, j) in (zip(range(2), range(3))):
    print i, j


0 0
1 1
>>> 

zip2在上述情况下,将您的列表转换为包含元素的元组列表,因为您正在压缩 2 个列表。

>>> zip(range(2), range(3))
[(0, 0), (1, 1)]

同样,如果你zip有三个列表,你将得到 3 元素元组的列表。

于 2012-11-08T23:00:07.717 回答
5

range(200), range(300)看起来太长了,但是我们可以通过查看[1]range(2), range(3)来理解这种情况:

iterable = (range(2), range(3))
print(iterable)
for i, j in iterable:
     print(repr(i))

第一次打印

([0, 1], [0, 1, 2])    #<-- This is what your iterable looks like
0

然后加注

ValueError: too many values to unpack

在循环的第一遍中,i等于 0 和j等于 1。在第二遍中,i,j被分配给[0,1,2]。显然有太多的值需要解包,因此例外。


脚注[1]

for i, j in range(2), range(3):

相当于

for i, j in (range(2), range(3)):

这相当于

iterable = (range(2), range(3))
for i, j in iterable:
于 2012-11-08T23:05:56.327 回答
4

尝试使用zip

for i, j in zip(range(2),range(2)):
     print i,j

这只是 Python 语法。如果你想有两个循环变量,迭代对象必须包含长度为 2 的序列。但是,您的陈述与以下内容相同:

i, j = range(100)

您正在迭代序列[range(100), range(100)]。第一次迭代返回range(100),正如您在前面的示例中看到的那样,这显然失败了。

它可以使用,range(2)因为它返回一个长度为 2 的序列,您的i,j语句可以解压到该序列。

于 2012-11-08T22:59:02.423 回答