Asignaciones y referencias en Python

En este post examinaremos una cuestión importante en cuanto al tratamiento de variables. En particular, el tema que abordaremos consiste en las asignaciones y referencias en Python. Es decir, veremos qué sucede detrás de escenas cuando asignamos un valor a una variable.

Asignaciones y referencias

Consideremos el siguiente caso en el que asignamos el valor 25 a la variable a:

a = 25

y luego igualamos b con a:

b = a

En este punto ambas variables tienen asignado el mismo valor, como es de esperar. A continuación, vemos qué sucede cuando se asignan listas en vez de números a estas variables.

Comencemos con a:

a = [1, 2, 3, 4, 5, 6] # Lista de números enteros
b = a
a[2] = 10
print(a)
print(b)

En la animación 1 podemos observar que ambas listas (a y b) son iguales al final de la ejecución. Además, podemos ver lo que sucede con b cuando se cambia el valor del elemento correspondiente al índice 2 de a:

Asignaciones y referencias en Python
Animación 1 – Asignaciones y referencias en Python

¿Cómo puede ser esto? La respuesta es simple. Cuando asignamos una lista a una variable, lo que guardamos en la misma es en realidad una referencia a la lista y no la lista en sí. Como consecuencia, al copiar la variable a otra lo que hicimos fue copiar la referencia y no un valor. De esta manera, al modificar la lista referenciada en a el cambio es también visible en b.

Lo que acabamos de observar para variables que contienen números o listas se aplica también a otros tipos de datos inmutables o mutables, respectivamente.

La función deepcopy()

Finalmente veamos cómo podemos hacer que la referencia a un elemento mutable no se copie a otro en el escenario anterior. Es decir, los cambios que se hagan a una variable no se verán reflejados en la otra. Para eso utilizaremos la función deepcopy() del módulo copy como vemos a continuación:

import copy
a = [1, 2, 3, 4, 5, 6]
b = copy.deepcopy(a)
a[2] = 10
print(a)
print(b)

En la Animación 2 podemos ver la ejecución del código anterior paso a paso:

Asignaciones y referencias: el uso de la función copy.deepcopy()
Animación 2 – Asignaciones y referencias: el uso de la función copy.deepcopy()

Es importante destacar que en este caso las variables a y b contienen referencias a dos listas separadas. Es por eso que al alterar una los cambios no se observan en la otra.

Espero que este post les haya resultado informativo. ¡Nos reencontramos en el próximo!

PD: Un tratado más extenso sobre este tema se puede encontrar en este link (en inglés).