なぜこのコードは間違っているのですか?
for i,j in range(100),range(200,300):
print i,j
これをステートメントでテストすると、このエラーが表示されます
ValueError: アンパックする値が多すぎます
しかし、私がテストするとき
for i, j in range(2),range(2):
print i,j
すべてが正しいです!
range(2)
リスト[0、1]を与えます。したがって、i, j
最初のリストからフェッチされ、次に2番目のリストからフェッチされます。
したがって、ループは次のようになります。-
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
を使用して、両方のリストを1つに圧縮してみてください。:-
>>> 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要素のタプルのリストが表示されます。
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 に等しくなります。2 番目のパスで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:
使ってみてくださいzip
:
for i, j in zip(range(2),range(2)):
print i,j
それは単なるPython構文です。2 つのループ変数が必要な場合、反復オブジェクトには長さ 2 のシーケンスが含まれている必要があります。ただし、あなたのステートメントは次と同じです。
i, j = range(100)
あなたはシーケンスを繰り返しています[range(100), range(100)]
。最初の反復は を返しrange(100)
ます。前の例からわかるように、これは明らかに失敗しています。
これは、ステートメントをアンパックできるrange(2)
長さ 2 のシーケンスを返すため、機能します。i,j