5

なぜこのコードは間違っているのですか?

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

これをステートメントでテストすると、このエラーが表示されます

ValueError: アンパックする値が多すぎます

しかし、私がテストするとき

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

すべてが正しいです!

4

3 に答える 3

16

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

zip22つのリストを圧縮しているので、上記の場合、リストを要素を持つタプルのリストに変換します。

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

同様に、zip3つのリストを作成すると、3要素のタプルのリストが表示されます。

于 2012-11-08T23:00:07.717 に答える
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 に等しくなります。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:
于 2012-11-08T23:05:56.327 に答える
4

使ってみてください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

于 2012-11-08T22:59:02.423 に答える