Las listas en Python son estructuras de datos mutables, lo que significa que su contenido puede modificarse después de su creación. Esta característica las diferencia de las tuplas, que son inmutables y no permiten cambios una vez definidas. Mientras que la mutabilidad de las listas ofrece gran flexibilidad, también puede generar efectos inesperados si no se gestionan de forma adecuada. Problemas como modificaciones no deseadas, referencias compartidas y errores en las funciones que reciben listas como argumentos son comunes al trabajar con listas mutables.
En esta entrada, abordaremos algunos de los errores más frecuentes que pueden aparecer al trabajar con listas mutables en Python y explicaremos cómo evitarlos para lograr un código más robusto, predecible y fácil de mantener.
Tabla de contenidos
En Python, los objetos pueden ser mutables o inmutables:
mi_lista = [1, 2, 3] mi_lista.append(4) # Modificamos la lista original print(mi_lista)
[1, 2, 3, 4]
Aquí te mostramos algunos de los errores más comunes y cómo evitarlos para que tu código sea más seguro y fácil de mantener.
En Python, cuando asignas una lista a otra variable, ambas referencias apuntan al mismo objeto en memoria. Es decir, hay una única lista en memoria con dos nombres. Esto puede llevar a modificaciones no deseadas si una de las listas es modificada.
lista_a = [1, 2, 3] lista_b = lista_a # Ambas variables apuntan a la misma lista lista_b.append(4) # Modificamos lista_b print(lista_a) # La lista_a también cambió
[1, 2, 3, 4]
Solución: Para evitar este comportamiento, utiliza métodos como copy()
o deepcopy()
para crear copias independientes de la lista:
lista_a = [1, 2, 3] lista_b = lista_a.copy() # Ahora lista_b es una copia independiente lista_b.append(4) print(lista_a) # [1, 2, 3] (No se modifica) print(lista_b) # [1, 2, 3, 4]
[1, 2, 3]
[1, 2, 3, 4]
Si la lista contiene elementos mutables, como sublistas, es recomendable usar deepcopy()
:
import copy lista_anidada = [[1, 2], [3, 4]] copia_profunda = copy.deepcopy(lista_anidada)
Cuando pasamos una lista como argumento a una función, esta puede modificarse dentro de la función, lo cual puede producir efectos indeseados si no se toma precaución.
def agregar_elemento(lista): lista.append(100) # Modifica la lista original mi_lista = [1, 2, 3] agregar_elemento(mi_lista) print(mi_lista) # Se modificó inesperadamente
[1, 2, 3, 100]
Solución: Para evitar este problema, haz una copia de la lista dentro de la función antes de modificarla:
def agregar_elemento(lista): lista_copia = lista.copy() # Copia de la lista lista_copia.append(100) return lista_copia mi_lista = [1, 2, 3] nueva_lista = agregar_elemento(mi_lista) print(mi_lista) # No cambia print(nueva_lista) # Nueva lista con un elemento
[1, 2, 3]
[1, 2, 3, 100]
Una de las trampas más sutiles en Python ocurre cuando usas una lista mutable como valor predeterminado de un parámetro de función. En este caso, todas las llamadas sucesivas compartirán la misma lista.
def agregar_valor(valor, lista=[]): lista.append(valor) return lista print(agregar_valor(1)) # [1] print(agregar_valor(2)) # [1, 2] (Acumula valores inesperadamente) print(agregar_valor(3)) # [1, 2, 3]
[1]
[1, 2]
[1, 2, 3]
Solución: Una forma de evitar este comportamiento es usar None
como valor predeterminado y crear una nueva lista dentro de la función:
def agregar_valor(valor, lista=None): if lista is None: lista = [] # Se crea una nueva lista en cada llamada lista.append(valor) return lista print(agregar_valor(1)) # [1] print(agregar_valor(2)) # [2] (Ya no acumula valores inesperados)
[1]
[2]
Si una lista mutable contiene otras listas, cambiar una sublista afectará todas las referencias a esa sublista. Este problema puede ser difícil de detectar si no se presta atención.
matriz = [[0] * 3] * 3 # Crea 3 referencias al mismo objeto matriz[0][0] = 1 print(matriz) # Todas las filas cambiaron
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
Solución: Usa comprensión de listas para crear copias independientes de cada sublista:
matriz = [[0] * 3 for _ in range(3)] # Cada fila es una lista independiente matriz[0][0] = 1 print(matriz)
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
Las listas mutables en Python son una herramienta poderosa y flexible, pero pueden llevar a errores difíciles de detectar si no se manejan adecuadamente. Siguiendo las buenas prácticas aquí descritas, puedes evitar problemas comunes como referencias compartidas, modificaciones no deseadas y errores complicados en funciones. Asegúrate de crear copias adecuadas cuando sea necesario y ten en cuenta la mutabilidad de las estructuras de datos para escribir un código más predecible y fácil de depurar.
Nota: La imagen de este artículo fue generada utilizando un modelo de inteligencia artificial.
En casi cualquier análisis estadístico —ya sea en medicina, psicología, economía o ciencia de datos—…
El MSCI World Index suele presentarse como “la ventana al mundo” para quienes invierten en…
En el mundo del análisis de datos solemos escuchar una idea poderosa: cuantos más datos,…
¿Te has encontrado con este error al intentar instalar paquetes con npm? npm ERR! code…
En ciencia de datos y estadística, los promedios y porcentajes son herramientas fundamentales para resumir…
Las bases de datos son el corazón de casi cualquier sistema de información moderno. Ya…
This website uses cookies.