[Python] Assegnamento e liste

enrico franchi enrico.franchi a gmail.com
Mar 17 Gen 2012 16:23:53 CET


2012/1/17 Diego Barrera <diegonebarrera a yahoo.it>:

> Chiaramente ho risolto, ma perche' si comporta cosi'?

E' l'unico comportamento sensato e che ci si puo' attendere.

a = b = Foo()

In questo caso a e b sono due diversi modi di accedere allo stesso oggetto.
Quando hai scritto quell'istruzione hai legato il nome a e il nome b
all'oggetto che hai creato con Foo() (qui innanzi detto #foo).

Se scrivi

a.modify()

Utilizzi a per raggiungere #foo, su cui chiami il metodo modify (che
come si evince dal nome, lo modifica ;).
A questo punto siccome #foo e' modificato, chiunque va a vedere #foo
lo vede modificato.

Se invece fai

a = Bar()

tu non modifichi l'oggetto #foo, modifichi il legame fra a e #foo.

Il tuo primo caso e' un'istanza di questo: hai tre diversi modi per
accedere ad una stessa lista e modifichi uno di questi legami in modo
che si riferisce ad un'altra lista. Il secondo caso invece e' diverso:
li hai proprio modificato l'oggetto lista cui si riferivano i tre
nomi. Tutti e tre lo vedono modificato.

Per una versione piu' completa e piu' divertente:

http://python.net/~mwh/hacks/objectthink.html

Sono due bellissime spiegazioni di questo fatto.



-- 
.
..: -enrico-


Maggiori informazioni sulla lista Python