为什么这段代码错了?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
每一件事情是正确的!
为什么这段代码错了?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
每一件事情是正确的!
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元素的元组的列表。
尝试使用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
语句可以解压缩到该序列。
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:
这是正确的,但你可以给一个说明?目前尚不清楚为什么会出现这种情况。 –
增加了一些关于此的内容。 – kichik