2016-01-09 11 views
22

Ecco uno snippet di codice che fornisce l'output: 0 1 2 2. Mi aspettavo che l'uscita 3 3 3 3 dal a[-1] acceda al numero 3 nell'elenco. La spiegazione fornita online dice "Il valore di a[-1] modifiche in ogni iterazione" ma non capisco bene come o perché. Qualsiasi spiegazione sarebbe fantastica!per loop e iterazione tramite elenchi

a = [0, 1, 2, 3] 
for a[-1] in a: 
    print(a[-1]) 
+1

Non ho mai visto nulla del genere; Mi piacerebbe leggere l'articolo/tutorial/qualunque sia quello che mostra questo esempio, potresti postare un link ad esso? – GingerPlusPlus

+3

Inoltre, congratulazioni per la bella prima domanda! (fiducia nei nuovi utenti SO ripristinati) – GingerPlusPlus

+3

Bella domanda. Perché 'a [-1]' è permesso anche come variabile loop ... – timgeb

risposta

15

Quello che sta succedendo qui è un elenco mutato durante il ciclo.

Consideriamo seguente frammento di codice:

a = [0, 1, 2, 3] 
for a[-1] in a: 
    print a 

uscita è:

[0, 1, 2, 0] 
[0, 1, 2, 1] 
[0, 1, 2, 2] 
[0, 1, 2, 2] 

Ogni iterazione:

  • legge il valore dalla posizione attualmente puntato dal puntatore interno
  • assegna immediatamente per ultimo elemento nella lista
  • dopo che l'ultimo elemento viene stampato sullo standard output

così si va come:

  • punti puntatore interno primo elemento, è 0, e l'ultimo elemento viene sovrascritto con quel valore; la lista è [0, 1, 2, 0]; il valore stampato è 0
  • il puntatore interno punta al secondo elemento, è 1 e l'ultimo elemento viene sovrascritto con quel valore; la lista è [0, 1, 2, 1]; il valore stampato è 1
  • (...)
  • all'ultimo passaggio, il puntatore interno punta all'ultimo elemento; l'ultimo elemento viene sovrascritto da solo - l'elenco non cambia sull'ultima iterazione; anche l'elemento stampato non cambia.
34

Mentre si fa for a[-1] in a, è effettivamente scorrere l'elenco e temporary store il valore dell'elemento corrente in a[-1].

Potete vedere il ciclo come queste istruzioni:

a[-1] = a[0] # a = [0, 1, 2, 0] 
print(a[-1]) # 0 
a[-1] = a[1] # a = [0, 1, 2, 1] 
print(a[-1]) # 1 
a[-1] = a[2] # a = [0, 1, 2, 2] 
print(a[-1]) # 2 
a[-1] = a[3] # a = [0, 1, 2, 2] 
print(a[-1]) # 2 

Così, quando si è sul terzo elemento, quindi 2 viene memorizzato per a[-1] (il cui valore è 1, ma era 0 prima e 3 all'avvio).

Infine, quando si tratta dell'ultimo elemento (e della fine dell'iterazione), l'ultimo valore memorizzato in a[-1] è 2 che spiega perché viene stampato due volte.

Problemi correlati