[Python] Puntatori o pseudo-tali

Daniele Zambelli daniele.zambelli a inwind.it
Dom 15 Lug 2007 18:24:32 CEST


Alle martedì 10 luglio 2007, Pietro Battiston ha scritto:
> Salve a tutti, ho un problema "teorico". Se eseguo il seguente codice:
>
> class pippo():
>      def __init__(self, pezzo):
>           self.pezzo = pezzo
>
> a = pippo(10)
> b = a
> a.pezzo = 5
> print b.pezzo
>
> ... otterrò come risultato 5, perché a e b si riferiscono esattamente
> allo stesso oggetto, che è stato modificato. Fin qui tutto bene (anche
> se ci ho messo un po' a capirlo).
>
> Però se dò il seguente codice:
>
> a = 10
> b = a
> a = 5
> print b
>
> ... ottengo invece come risultato 10, perché a e b si riferiscono a due
> oggetti diversi.

Io l'ho capita così:

L'operatore '=' associa all'identificatore che si trova a sinistra l'oggetto 
che si trova a destra. Se a destra c'è un identificatore, l'identificatore 
che c'è a sinistra di '=' è associato all'oggetto identificato 
dall'identificatore di destra.

> class Pippo():            # Meglio con la maiuscola iniziale
>      def __init__(self, pezzo):
>           self.pezzo = pezzo
>
> a = pippo(10)             # a è ass. ad un oggetto della classe Pippo
> b = a                     # b è associato allo stesso geetto
> a.pezzo = 5               # viene modificato un attributo di questo oggetto
> print b.pezzo             # viene stampato l'attributo di questo oggetto

Osservare che gli oggetti sono "oggetti" *mutabili*.

seconda situazione:

> a = 10                    # a è associato all'oggetto 10
> b = a                     # b è associato allo stesso oggetto 10
> a = 5                     # ora a è associato all'oggetto 5
> print b                   # giustamente b continua ad essere associato a 10

In altri linguaggi quando si parla di variabili ci si riferisce alla metafora 
dei contenitori: una variabile è un contenitore nel quale si ricopia un 
contenuto, a meno che non si lavori esplicitamente con puntatori.
In Python le "variabili" sono delle etichette per oggetti: tante etichette 
diverse possono puntare allo stesso oggetto, posso modificare quell'oggetto a 
partire da una qualunque delle sue etichette. Viceversa la stessa etichetta, 
in momenti diversi può indicare oggetti completamente diversi.

Questo modo di lavorare risulta molto naturale, penso che confonda di più chi 
è abituato ad altri linguaggi perché è abituato ad altri meccanismi, in 
realtà più rigidi.

Spero di essere stato chiaro e, se ci sono degli errori, che qualcuno mi 
corregga.

Ciao

-- 

Daniele
                          giusto!
  _o)  (o_       (o_ _o)  nel verso
-./\\  //\.-     //\ /\\  forse è perché non guardiamo le cose
 _\_V  V_/_      V_/ \_V  Quando non ci capiamo,


Maggiori informazioni sulla lista Python