ValueError:要解压缩的值太多

2 8*_*2 8 4 python loops

为什么这段代码错了?

for i,j in range(100),range(200,300):
    print i,j
Run Code Online (Sandbox Code Playgroud)

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

ValueError:要解压缩的值太多

但是当我测试的时候

for i, j in range(2),range(2):
     print i,j
Run Code Online (Sandbox Code Playgroud)

一切都是正确的!

Roh*_*ain 14

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

所以,你的循环类似于: -

for i, j in [0, 1], [0, 1]:
    print i, j
Run Code Online (Sandbox Code Playgroud)

印刷品: -

0 1
0 1
Run Code Online (Sandbox Code Playgroud)

现在,如果你range(3)有,那么它将失败,因为,range(3)给出一个3元素列表,无法解压缩two loop variables.

所以,你做不到: -

for (i, j) in [[0, 1, 2]]:
    print i, j
Run Code Online (Sandbox Code Playgroud)

它会失败,给你错误.

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

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


0 0
1 1
>>> 
Run Code Online (Sandbox Code Playgroud)

zip将您的列表转换为具有2上述情况中元素的元组列表,因为您正在压缩2个列表.

>>> zip(range(2), range(3))
[(0, 0), (1, 1)]
Run Code Online (Sandbox Code Playgroud)

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


unu*_*tbu 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))
Run Code Online (Sandbox Code Playgroud)

第一次打印

([0, 1], [0, 1, 2])    #<-- This is what your iterable looks like
0
Run Code Online (Sandbox Code Playgroud)

然后提高

ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)

在第一次循环中,i等于0并j等于1.在第二次传递中,i,j分配给[0,1,2].很明显,解压缩的值太多,因此例外.


脚注[1]:

for i, j in range(2), range(3):
Run Code Online (Sandbox Code Playgroud)

相当于

for i, j in (range(2), range(3)):
Run Code Online (Sandbox Code Playgroud)

这相当于

iterable = (range(2), range(3))
for i, j in iterable:
Run Code Online (Sandbox Code Playgroud)