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
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
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 2
di 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
.
Vent'anni di Python, e non ho mai pensato di fare 'for a [x] in a:'. Grazie :-) – RemcoGerlich
Lo stesso qui; Ho sempre pensato che dovesse essere un nome, piuttosto che un lvalue arbitrario. – chepner
@chepner: è solo un elenco di destinazione. Quindi anche 'modulename.global_var' è valido. O 'dizionario [chiave]'. O una lista di quelli .. –