Tipos de datos mutables e inmutables en Python

Aunque las listas y las cadenas tienen relación ya que ambos pertenecen al tipo secuencia, las listas y las cadenas son diferentes en un aspecto importante. Un valor de lista es un tipo de dato mutable: se le pueden añadir, eliminar o cambiar valores. Sin embargo, una cadena es inmutable: no puede modificarse. Tratar de reasignar un solo carácter en una cadena resulta en un error TypeError, como puede ver introduciendo lo siguiente en el shell interactivo:

>>> name = 'Zophie a cat'
>>> name[7] = 'the'
Traceback (most recent call last):
  File "<pyshell#50>", line 1, in <module>
    name[7] = 'the'
TypeError: 'str' object does not support item assignment

La forma correcta de «mutar» una cadena es utilizar el corte y la concatenación para construir una nueva cadena copiando a partir de partes de la cadena antigua. Introduzca lo siguiente en el shell interactivo:

>>> name = 'Zophie a cat'
>>> newName = name[0:7] + 'the' + name[8:12]
>>> name
'Zophie a cat'
>>> newName
'Zophie the cat'

Usamos [0:7] y [8:12] para referirnos a los caracteres que no queremos sustituir. Observa que la cadena original 'Zophie a cat' no se modifica, porque las cadenas son inmutables.

Aunque el valor de una lista es mutable, la segunda línea del siguiente código no modifica la lista eggs:

>>> eggs = [1, 2, 3]
>>> eggs = [4, 5, 6]
>>> eggs
[4, 5, 6]

El valor de la lista en eggs no está siendo modificado aquí; más bien, un valor de lista completamente nuevo y diferente ([4, 5, 6]) está sobrescribiendo el valor de la lista anterior ([1, 2, 3]). Esto se muestra en la siguiente imagen.

Cuando se ejecuta eggs = [4, 5, 6], el contenido de eggs se sustituye por un nuevo valor de lista

Si quisieras modificar realmente la lista original en huevos para que contenga [4, 5, 6], tendrías que hacer algo como esto:

>>> eggs = [1, 2, 3]
>>> del eggs[2]
>>> del eggs[1]
>>> del eggs[0]
>>> eggs.append(4)
>>> eggs.append(5)
>>> eggs.append(6)
>>> eggs
[4, 5, 6]

En el primer ejemplo, el valor de la lista con el que termina eggs es el mismo valor de la lista con el que empezó. Sólo que esta lista ha sido modificada, en lugar de sobrescrita. La imagen muestra los siete cambios realizados por las primeras siete líneas del ejemplo anterior de shell interactivo.

La sentencia del y el método append() modifican el mismo valor de la lista en su lugar.

Cambiar un valor de un tipo de datos mutable (como lo que hacen la sentencia del y el método append() en el ejemplo anterior) cambia el valor en el lugar, ya que el valor de la variable no es reemplazado por un nuevo valor de la lista.

Deja una respuesta