2013/10/13 Gollum1 <gollum1.smeag...@gmail.com> > ciao a tutti, ho trovato questo bel libro[1] in formato epub, che mi > ha permesso di capire alcune cosine che non riuscivo proprio a farmi > entrare in testa, per esempio sono finalmente riuscito a capire i > generatori, che per quanto leggessi i vostri post, non mi riusciva > proprio di farmi entrare in testa... e il bello è che il libro è > scritto in inglese, e il mio inglese è moooolto arrugginito, ma > miracolosamente riesco a capirlo (merito forse dell'introduzione che > ho fatto con i libri in italiano di Marco B.). > > ma veniamo alla domanda... > > >>> d=dict(november=11, oscar=12, papa=13, quebec=14) > >>> v1=v2=d.keys() > > >>> v1,v2 > (dict_keys(['november', 'oscar', 'papa', 'quebec']), > dict_keys(['november', 'oscar', 'papa', 'quebec'])) > >>> v1[3]="X" > Traceback (most recent call last): > File "<console>", line 1, in <module> > TypeError: 'dict_keys' object does not support item assignment > > e questo mi pare abbastanza comprensibile... praticamente non posso > cambiare la chiave di un dizionario... >
No. Praticamente in Python 3, keys() ti ritorna una "vista" non modificabile sopra la sequenza delle chiavi presenti nel dizionario. In Python 2, per capirci, non e' cosi'. In [1]: d=dict(november=11, oscar=12, papa=13, quebec=14) In [2]: v1=v2=d.keys() In [3]: v1,v2 Out[3]: (['oscar', 'november', 'papa', 'quebec'], ['oscar', 'november', 'papa', 'quebec']) In [4]: v1[3] = 'X' In [5]: v1 Out[5]: ['oscar', 'november', 'papa', 'X'] > > perché allora nelle risposte che ci sono pubblicare sul libro ottengo > questa risposta? > > The first time, v1 and v2 will be the same because they share the > same list of dictionary keys. The second time they will differ > because each has its own independent copy of the dictionary's keys. > > parla di due tempi, in quanto prima fa la prova con > >>> v1=v2=d.keys() > e poi la stessa prova con > >>> v1=d.keys() > >>> v2=d.keys() > Questa e' una seconda cosa, molto importante che devi assolutamente capire. Ci si riconduce alla differenza fra il concetto di uguaglianza e quello di identita'. 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). Allo stesso modo, due liste possono essere *uguali* ma non essere *la stessa* lista. Nota, se questo concetto non ti e' piu' che chiaro, in pratica non riesci a scrivere programmi senza bachi se non per puro caso. >>> v1=d.keys() >>> v2=d.keys() Queste sono due liste *diverse* (almeno in Python 2). In [6]: v1 = d.keys() In [7]: v2 = d.keys() In [8]: id(v1), id(v2) Out[8]: (4491266672, 4487923472) In [9]: v1 is v2 Out[9]: False Ovviamente se fai In [10]: v1=v2=d.keys() Dai due diversi nomi allo stesso oggetto. Che e' appunto lo stesso. Quindi quando lo modifichi, lo modifichi, a prescindere dal nome con cui gli accedi.
_______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python