A Byte of Python

Riferimenti

Quando si crea un oggetto e lo si assegna ad una variabile, la variabile si riferisce all'oggetto costruito ma non lo rappresenta assolutamente! Il nome della variabile in questione punta ad una parte di memoria fisica del PC in cui è stato memorizzato l'oggetto. Questo riferimento è chiamato spesso collegamento (binding) del nome all'oggetto.

Una particolarità cui prestare attenzione è quella dimostrata dall'esempio seguente, che nell'esperienza comune non ha creato troppi problemi ma che è sempre bene tener presente.

Oggetti e riferimenti

Esempio 9.6. Oggetti e riferimenti

				
#!/usr/bin/python
# Filename: reference.py

print 'Simple Assignment'
shoplist = ['apple', 'mango', 'carrot', 'banana']
mylist = shoplist # mylist e' un altro nome che punta allo stesso oggetto!

del shoplist[0] # Abbiamo acquistato il primo oggetto, dobbiamo percio' rimuoverlo

print 'shoplist is', shoplist
print 'mylist is', mylist
# notare che sia shoplist che mylist stampano la stessa lista
# senza l'elemento 'apple' a conferma che puntano realmente allo stesso oggetto

print 'Copy by making a full slice'
mylist = shoplist[:] # make a copy by doing a full slice
del mylist[0] # remove first item

print 'shoplist is', shoplist
print 'mylist is', mylist
# notare adesso la differenza tra le liste
				
				

Output

				
$ python reference.py
Simple Assignment
shoplist is ['mango', 'carrot', 'banana']
mylist is ['mango', 'carrot', 'banana']
Copy by making a full slice
shoplist is ['mango', 'carrot', 'banana']
mylist is ['carrot', 'banana']
				
				

Funzionamento

Buona parte della spiegazione è contenuta nei commenti. Occorre invece prestare attenzione al fatto che se si vuole fare una copia di lista, sequenze o altri oggetti complessi (non oggetti semplici come possono essere gli interi), è necessario ricorrere alle operazioni di affettamento. Se si assegna un nuovo nome ad una variabile, entrambi i nomi (vecchio e nuovo) si riferiranno allo stesso oggetto e, come è facile immaginare, questo potrebbe indurre in clamorosi errori di programmazione.

Nota per i programmatori di Perl

Ricordarsi che un comando di assegnamento per le liste non crea una copia fisica. Per fare la copia si deve necessariamente ricorrere alle operazioni di affettamento descritte.