ValueError:要解压缩的值太多

时间:2012-11-08 22:56:21

标签: python loops

为什么这段代码错了?

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

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

  

ValueError:要解压缩的值太多

但是当我测试时

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

每件事都是正确的!

3 个答案:

答案 0 :(得分: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元素元组的列表。

答案 1 :(得分:5)

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

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:

答案 2 :(得分: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语句解压缩到。