2016-01-27 17 views
8

私はこのループを見ましたが、最後のプリントが2である理由はわかりませんでした。 なぜ3ではないのですか?アウト奇妙なループステートメント

a = [0, 1, 2, 3] 

for a[-1] in a: 
    print(a[-1]) 

0 
1 
2 
2 
+5

20年のPythonで、私は 'a [a]のために'を行うことは決して考えなかった。ありがとう:-) – RemcoGerlich

+0

同じです。私はいつも、それが任意の左辺値ではなく名前でなければならないと仮定しました。 – chepner

+0

@chepner:これは単なるターゲットリストです。したがって、 'modulename.global_var'も有効です。または 'dictionary [key]'です。またはそれらのリスト.. –

答えて

20

forループが反復可能な入力から各値を割り当て、変数標的としてa[-1]を使用する:

for <target> in <iterable> 

forループが各値を代入しますその1つのターゲットにaのリスト、a[-1]。それはまたと同じリスト内の最後の要素になります。

だからリストループを介して各ステップでを変更:

>>> a = [0, 1, 2, 3] 
>>> for a[-1] in a: 
...  print a 
... 
[0, 1, 2, 0] # assigned a[0] == 0 to a[-1] (or a[3]) 
[0, 1, 2, 1] # assigned a[1] == 1 to a[-1] 
[0, 1, 2, 2] # assigned a[2] == 2 to a[-1] 
[0, 1, 2, 2] # assigned a[3] == 2 (since the previous iteration) to a[-1] 

一しかし、最後の反復は、a[3](又はa[-1]a[-2])に入れa[2]を割り当て、なぜ、場合すなわち最後の反復が行われると、2が表示されます。

for loop grammarを参照してください。割り当て先はassigment statementのように、のターゲットリストが割り当てられます。代入の単純な名前に限定されるものではなく、forのループでもありません。