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.

Deja una respuesta