A Byte of Python

Referències

Quan creem un objecte i l'assignem a una variable, la variable simplement fa referència a l'objecte però no representa l'objecte. És a dir, el nom de la variable apunta a la posició de memòria que conté l'objecte. Això es coneix com vinculació o binding del nom a l'objecte.

Generalment no ens hem de preocupar d'aquests detalls, però les referències provoquen un efecte subtil que hem de conèixer. Veiem-ho amb el següent exemple.

Objectes i referències

Example 9.6. Objectes i referències

				
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Filename: reference.py

print 'Assignació simple'
shoplist = ['poma', 'mango', 'pastanaga', 'platan']
mylist = shoplist # mylist és només un altre nom apuntant al mateix objecte!

del shoplist[0] # Compro el primer element, així que l'elimino de la llista

print 'shoplist és', shoplist
print 'mylist és', mylist
# Notem que tant shoplist com mylist contenen els mateixos elements sense
# 'poma', confirmant que ambdós apunten al mateix objecte

print 'Copia fent un segment complet'
mylist = shoplist[:] # fem una còpia a partir d'un segment complet
del mylist[0] # eliminem el primer element

print 'shoplist és', shoplist
print 'mylist és', mylist
# notem que ara les dues llistes són diferents
				
				

Sortida

				
$ python reference.py

Assignació simple
shoplist és ['mango', 'pastanaga', 'platan']
mylist és ['mango', 'pastanaga', 'platan']
Copia fent un segment complet
shoplist és ['mango', 'pastanaga', 'platan']
mylist és ['pastanaga', 'platan']
				
				

Com funciona

Els comentaris haurien de ser suficients per a entendre l'exemple. Hem de recordar que si volem fer una còpia d'una llista o d'altres seqüències (no objectes simples com ara els enters), haurem de fer servir l'operació de segmentació. Quan assignem el nom d'una variable a un altre nom, ambdós passen a fer referència al mateix objecte, i això pot portar a tota mena de problemes si no anem amb compte.

Nota pels programadors de Perl

Recordem que una sentència d'assignació per llistes no crea una còpia. Hem de fer servir l'operació de segmentació per a copiar una seqüència.