[Python] Esercizio da un libro...

enrico franchi enrico.franchi a gmail.com
Dom 13 Ott 2013 12:48:06 CEST


2013/10/13 Gollum1 <gollum1.smeagol1 a 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.
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20131013/a42a02e3/attachment.html>


Maggiori informazioni sulla lista Python