<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">Il giorno 05 settembre 2014 10:18, Walter Valenti <span dir="ltr"><<a href="mailto:waltervalenti@yahoo.it" target="_blank">waltervalenti@yahoo.it</a>></span> ha scritto:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Prendiamo questo semplice codice:<br>
<br>
<br>
def list():<br>
    elem = dict()<br>
    lista = []<br>
    for x in range(3):<br>
        elem['nome'] = x<br>
        lista.append(elem)<br>
    print lista<br>
list()<br>
<br>
Mi aspetterei come output:<br>
[{'nome': 0}, {'nome': 1}, {'nome': 2}]<br>
Quello che ottengo è invece:<br>
[{'nome': 2}, {'nome': 2}, {'nome': 2}]<br></blockquote><div><br></div><div>imho quello che ti spiazza è il comportamento dell'append(), perchè ti aspetti che all'interno del ciclo for, <br></div><div>l'append gestisca il *valore*, mentre in realta' gestisce le referenze. Mi spiego meglio: quando usi l'append() tu <br></div><div>non fai altro che prendere una referenza al valore di elem ed assegnarla in coda alla list lista.<br></div><div>Facendo in questo modo, ad ogni ciclo, al sovrascrivere del valore di elem, variano tutte le sue referenze,<br></div><div>ed è per questo motivo che -a fine ciclo- ti ritrovi [{'nome': 2}, {'nome': 2}, {'nome': 2}], cioè il valore *finale* di elem, cui puntano <br></div><div>tutte le referenze appese in precedenza.<br></div><div> <br></div><div>A tal proposito, guarda il comportamento del seguente codice:<br><br>def list():<br>    elem = dict()<br>    lista = []<br>    for x in range(3):<br>        elem['nome'] = x<br>        copia_shallow = elem.copy()<br>        lista.append(copia_shallow)<br>    print(lista)<br>list()<br><br>risultato:<br>[{'nome': 0}, {'nome': 1}, {'nome': 2}]<br></div><div><br></div><div>ciao<br></div>Alberto De Prezzo<br></div></div></div>