Il giorno 05 settembre 2014 10:18, Walter Valenti <waltervale...@yahoo.it> ha scritto:
> Prendiamo questo semplice codice: > > > def list(): > elem = dict() > lista = [] > for x in range(3): > elem['nome'] = x > lista.append(elem) > print lista > list() > > Mi aspetterei come output: > [{'nome': 0}, {'nome': 1}, {'nome': 2}] > Quello che ottengo è invece: > [{'nome': 2}, {'nome': 2}, {'nome': 2}] > imho quello che ti spiazza è il comportamento dell'append(), perchè ti aspetti che all'interno del ciclo for, l'append gestisca il *valore*, mentre in realta' gestisce le referenze. Mi spiego meglio: quando usi l'append() tu non fai altro che prendere una referenza al valore di elem ed assegnarla in coda alla list lista. Facendo in questo modo, ad ogni ciclo, al sovrascrivere del valore di elem, variano tutte le sue referenze, ed è per questo motivo che -a fine ciclo- ti ritrovi [{'nome': 2}, {'nome': 2}, {'nome': 2}], cioè il valore *finale* di elem, cui puntano tutte le referenze appese in precedenza. A tal proposito, guarda il comportamento del seguente codice: def list(): elem = dict() lista = [] for x in range(3): elem['nome'] = x copia_shallow = elem.copy() lista.append(copia_shallow) print(lista) list() risultato: [{'nome': 0}, {'nome': 1}, {'nome': 2}] ciao Alberto De Prezzo
_______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python