Asignación de variables por referencia en Python
Como has visto, las variables «almacenan» cadenas y valores enteros. Sin embargo, esta explicación es una simplificación de lo que Python hace en realidad. Técnicamente, las variables están almacenando referencias a las ubicaciones de memoria de la computadora donde se almacenan los valores. Introduzca lo siguiente en el shell interactivo:
>>> spam = 42
>>> cheese = spam
>>> spam = 100
>>> spam
100
>>> cheese
42
Cuando asignas 42
a la variable spam
, en realidad estás creando el valor 42
en la memoria del ordenador y almacenando una referencia a él en la variable spam
. Cuando copias el valor en spam
y lo asignas a la variable cheese
, en realidad estás copiando la referencia. Tanto la variable spam
como la variable cheese
hacen referencia al valor 42
en la memoria del ordenador. Cuando más tarde cambias el valor en spam
a 100
, estás creando un nuevo valor 100
y almacenando una referencia a él en spam
. Esto no afecta al valor en cheese
. Los enteros son valores inmutables que no cambian; cambiar la variable spam
es hacer que se refiera a un valor completamente diferente en la memoria.
Pero las listas no funcionan así, porque los valores de las listas pueden cambiar; es decir, las listas son mutables. Aquí hay algo de código que hará que esta distinción sea más fácil de entender. Introduce esto en el shell interactivo:
➊ >>> spam = [0, 1, 2, 3, 4, 5]
➋ >>> cheese = spam # The reference is being copied, not the list.
➌ >>> cheese[1] = 'Hello!' # This changes the list value.
>>> spam
[0, 'Hello!', 2, 3, 4, 5]
>>> cheese # The cheese variable refers to the same list.
[0, 'Hello!', 2, 3, 4, 5]
Esto puede parecerte extraño. El código sólo ha tocado la lista cheese
, pero parece que tanto la lista cheese
como la spam
han cambiado.
Cuando se crea la lista ➊, se le asigna una referencia en la variable spam
. Pero la siguiente línea ➋ copia sólo la referencia de la lista en spam
a cheese
, no el valor de la lista en sí. Esto significa que los valores almacenados en spam
y cheese
se refieren ahora a la misma lista. Sólo hay una lista subyacente porque la lista en sí misma nunca fue copiada. Así que cuando modificas el elemento de cheese
➌, estás modificando la misma lista a la que se refiere spam
.
Recuerda que las variables son como cajas que contienen valores. Las figuras anteriores de este capítulo muestran que las listas en cajas no son exactamente exactas, porque las variables de lista no contienen realmente listas: contienen referencias a listas. (Estas referencias tendrán números de identificación que Python utiliza internamente, pero puedes ignorarlos). Usando las cajas como metáfora de las variables, la siguiente imagen muestra lo que ocurre cuando se asigna una lista a la variable spam
.

spam = [0, 1, 2, 3, 4, 5]
almacena una referencia a una lista, no la lista real.Entonces, en la siguiente imagen, la referencia en spam
se copia en cheese
. Sólo se ha creado y almacenado una nueva referencia en cheese
, no una nueva lista. Observa cómo ambas referencias se refieren a la misma lista.

spam = cheese
copia la referencia, no la lista.Cuando se modifica la lista a la que hace referencia cheese
, también se modifica la lista a la que hace referencia spam
, porque tanto cheese
como spam
hacen referencia a la misma lista. Puedes ver esto en esta otra imagen.

cheese[1] = 'Hello!'
modifica la lista a la que se refieren ambas variables.Aunque las variables de Python técnicamente contienen referencias a valores, la gente suele decir casualmente que la variable contiene el valor.