2016-01-27 14 views
8

Ho visto questo per loop e non ho capito bene perché l'ultima stampa è 2. Perché non è 3?Weird for loop statement

a = [0, 1, 2, 3] 

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

out:

0 
1 
2 
2 
+5

Vent'anni di Python, e non ho mai pensato di fare 'for a [x] in a:'. Grazie :-) – RemcoGerlich

+0

Lo stesso qui; Ho sempre pensato che dovesse essere un nome, piuttosto che un lvalue arbitrario. – chepner

+0

@chepner: è solo un elenco di destinazione. Quindi anche 'modulename.global_var' è valido. O 'dizionario [chiave]'. O una lista di quelli .. –

risposta

20

Il ciclo for utilizza a[-1] come variabile bersaglio, assegnando ciascun valore dall'input iterable:

for <target> in <iterable> 

Il ciclo for assegna ogni valore l'elenco a per quell'obiettivo, a[-1]. Ciò accade a anche essere l'ultimo elemento in quella stessa lista.

Così la lista cambia ad ogni passo attraverso il ciclo:

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

L'uno-ma-ultima iterazione assegna mette a[2] in a[3] (o a[-2] in a[-1]), ed è per questo, quando la l'ultima iterazione viene eseguita, vedi 2di nuovo.

Vedere for loop grammar; ci vuole un generico target_list per il target di assegnazione, proprio come un assigment statement. Non sei limitato a semplici nomi di compiti, né sei in un ciclo for.