2012-11-08 43 views
2

为什么这段代码错了?ValueError:解包太多值

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

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

ValueError: too many values to unpack

,但是当我测试

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

每一件事情是正确的!

回答

13

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 
>>> 

zip您的列表转换成在上述情况下2元素的元组的列表,你荏苒2名列表。

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

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

3

尝试使用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语句可以解压缩到该序列。

+1

这是正确的,但你可以给一个说明?目前尚不清楚为什么会出现这种情况。 –

+0

增加了一些关于此的内容。 – kichik

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 

在冷杉t通过循环,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: 
相关问题