<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">2013/10/13 Gollum1 <span dir="ltr"><<a href="mailto:gollum1.smeagol1@gmail.com" target="_blank">gollum1.smeagol1@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

ciao a tutti, ho trovato questo bel libro[1] in formato epub, che mi<br>
ha permesso di capire alcune cosine che non riuscivo proprio a farmi<br>
entrare in testa, per esempio sono finalmente riuscito a capire i<br>
generatori, che per quanto leggessi i vostri post, non mi riusciva<br>
proprio di farmi entrare in testa... e il bello è che il libro è<br>
scritto in inglese, e il mio inglese è moooolto arrugginito, ma<br>
miracolosamente riesco a capirlo (merito forse dell'introduzione che<br>
ho fatto con i libri in italiano di Marco B.).<br>
<br>
ma veniamo alla domanda...<br>
<br>
>>> d=dict(november=11, oscar=12, papa=13, quebec=14)<br>
>>> v1=v2=d.keys()<br>
<br>
>>> v1,v2<br>
(dict_keys(['november', 'oscar', 'papa', 'quebec']),<br>
dict_keys(['november', 'oscar', 'papa', 'quebec']))<br>
>>> v1[3]="X"<br>
Traceback (most recent call last):<br>
  File "<console>", line 1, in <module><br>
TypeError: 'dict_keys' object does not support item assignment<br>
<br>
e questo mi pare abbastanza comprensibile... praticamente non posso<br>
cambiare la chiave di un dizionario...<br></blockquote><div><br></div><div>No. Praticamente in Python 3, keys() ti ritorna una "vista" non modificabile</div><div>sopra la sequenza delle chiavi presenti nel dizionario.</div>

<div><br></div><div>In Python 2, per capirci, non e' cosi'.</div><div><br></div><div><div>In [1]: d=dict(november=11, oscar=12, papa=13, quebec=14)</div><div><br></div><div>In [2]: v1=v2=d.keys()</div><div><br></div>

<div>In [3]: v1,v2</div><div>Out[3]:</div><div>(['oscar', 'november', 'papa', 'quebec'],</div><div> ['oscar', 'november', 'papa', 'quebec'])</div><div><br></div>

<div>In [4]: v1[3] = 'X'</div><div><br></div><div>In [5]: v1</div><div>Out[5]: ['oscar', 'november', 'papa', 'X']</div></div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<br>
perché allora nelle risposte che ci sono pubblicare sul libro ottengo<br>
questa risposta?<br>
<br>
The first time, v1 and v2 will be the same because they share the<br>
   same list of dictionary keys. The second time they will differ<br>
   because each has its own independent copy of the dictionary's keys.<br>
<br>
parla di due tempi, in quanto prima fa la prova con<br>
>>> v1=v2=d.keys()<br>
e poi la stessa prova con<br>
>>> v1=d.keys()<br>
>>> v2=d.keys()<br></blockquote><div><br></div><div><br></div><div>Questa e' una seconda cosa, molto importante che devi assolutamente capire.</div><div>Ci si riconduce alla differenza fra il concetto di uguaglianza e quello di identita'.</div>

<div><br></div><div>Penso che siamo d'accordo che, per esempio, due copie di uno stesso libro, preso da uno scaffale sono "uguali" (assumendo che non siano rovinate). Ma non sono lo *stesso* oggetto. Se fai un'orecchia ad uno, l'altra non si trova pure lei con l'orecchia (incidentalmente, se accadesse faresti collassare un po' di fisica contemporanea).</div>

<div><br></div><div>Allo stesso modo, due liste possono essere *uguali* ma non essere *la stessa* lista.</div><div><br></div><div>Nota, se questo concetto non ti e' piu' che chiaro, in pratica non riesci a scrivere programmi senza bachi se non per puro caso.</div>

<div><br></div><div>>>> v1=d.keys()<br>>>> v2=d.keys()<br></div><div><br></div><div>Queste sono due liste *diverse* (almeno in Python 2).</div><div><br></div><div><div>In [6]: v1 = d.keys()</div><div><br>

</div><div>In [7]: v2 = d.keys()</div><div><br></div><div>In [8]: id(v1), id(v2)</div><div>Out[8]: (4491266672, 4487923472)</div><div><br></div><div>In [9]: v1 is v2</div><div>Out[9]: False</div></div><div><br></div><div>

<br></div><div>Ovviamente se fai</div><div><br></div><div>In [10]: v1=v2=d.keys()<br></div><div><br></div><div>Dai due diversi nomi allo stesso oggetto. Che e' appunto lo stesso.</div><div>Quindi quando lo modifichi, lo modifichi, a prescindere dal nome con cui gli accedi.</div>

<div><br></div><div><br></div></div></div></div>