Mi chiedo alcuni dettagli su come ... in opere in Python.Perché Python "per ... in" funziona in modo diverso su un elenco di valori rispetto a un elenco di dizionari?
La mia comprensione è for var in iterable
su ogni iterazione crea una variabile, var, legata al valore corrente di iterabile. Pertanto, se si esegue for c in cows; c = cows[whatever]
, ma la modifica di c all'interno del ciclo non influisce sul valore originale. Tuttavia, sembra funzionare diversamente se stai assegnando un valore a un tasto del dizionario.
cows=[0,1,2,3,4,5]
for c in cows:
c+=2
#cows is now the same - [0,1,2,3,4,5]
cows=[{'cow':0},{'cow':1},{'cow':2},{'cow':3},{'cow':4},{'cow':5}]
for c in cows:
c['cow']+=2
# cows is now [{'cow': 2}, {'cow': 3}, {'cow': 4}, {'cow': 5}, {'cow': 6}, {'cow': 7}
#so, it's changed the original, unlike the previous example
vedo uno può usare enumerate per fare la prima opera ad esempio, troppo, ma questa è una storia diversa, immagino.
cows=[0,1,2,3,4,5]
for i,c in enumerate(cows):
cows[i]+=1
# cows is now [1, 2, 3, 4, 5, 6]
Perché influenza i valori di elenco originali nel secondo esempio ma non il primo?
[modifica]
Grazie per le risposte. Stavo guardando questo da un punto di vista PHP, dove è possibile utilizzare il simbolo & in foreach per specificare se si sta operando su un riferimento a una copia dell'iterazione. Vedo ora che la vera differenza è un dettaglio di base di come Python lavora con oggetti immutabili.
Ho accettato la tua risposta perché "immutabile" è la parola magica. Ricordo ora che gli int sono oggetti separati in Python, quindi è stato rebinding di quel nome su un altro oggetto nel primo esempio e modificando lo stesso oggetto nel secondo. – JAL