Manejo de referencias en memoria con diccionarios y map en Python

Clase 21 de 44Curso de Python: Comprehensions, Funciones y Manejo de Errores

Contenido del curso

Funciones

Manipulación de archivos y errores

Resumen

Cuando usas Map sobre una lista de diccionarios en Python, puedes encontrarte con un comportamiento inesperado: la lista original también se modifica. Entender por qué ocurre esto y cómo solucionarlo es fundamental para escribir código predecible y libre de efectos secundarios.

¿Por qué Map modifica la lista original al trabajar con diccionarios?

El problema aparece al iterar una lista de diccionarios con Map y agregar un nuevo atributo a cada elemento [0:36]. Al imprimir la nueva lista, los impuestos están calculados correctamente y cada diccionario tiene el atributo adicional. Sin embargo, al revisar la lista original (old list), esta también sufrió la misma modificación.

Esto rompe la expectativa de que Map cree una nueva lista sin alterar el estado de la original. La razón está en cómo Python maneja los diccionarios internamente: a través de la referencia en memoria [1:14].

¿Qué es la referencia en memoria?

Cuando trabajas con tipos primitivos como números o strings, cada transformación genera un nuevo valor que se asigna al nuevo array. El original permanece intacto.

Con los diccionarios el comportamiento es distinto:

  • Un diccionario no se copia como valor, sino que se pasa como una referencia al mismo espacio en memoria.
  • Al modificar el diccionario dentro de Map, estás alterando la referencia compartida.
  • Tanto el array nuevo como el original apuntan al mismo diccionario en memoria [1:36].

Por eso, al agregar un atributo en la línea de iteración, la modificación se refleja en ambas listas.

¿Cómo eliminar esa referencia de memoria con copy?

La solución es crear una copia independiente del diccionario antes de modificarlo [2:07]. Python ofrece el método copy() que duplica todos los valores del diccionario original sin arrastrar la referencia:

python new_item = item.copy() new_item['taxes'] = new_item['price'] * 0.19

  • copy() genera un nuevo diccionario con los mismos valores.
  • Las modificaciones sobre new_item no afectan al diccionario original.
  • La lista original se mantiene sin cambios de estado.

Al ejecutar el código con este ajuste [2:32], la nueva lista muestra los impuestos calculados y el atributo adicional, mientras que la lista original conserva su estructura intacta.

¿Qué relación tiene esto con la mutabilidad e inmutabilidad?

Este comportamiento se enmarca en el concepto de mutabilidad e inmutabilidad [2:44], presente en varios lenguajes de programación.

  • Mutable: el objeto puede cambiar su estado después de ser creado. Los diccionarios en Python son mutables por naturaleza.
  • Inmutable: el objeto no cambia; cualquier transformación produce uno nuevo.

Modificar directamente el diccionario dentro de Map es una operación mutable. No es necesariamente un error: si deseas que la lista original también refleje los cambios, ese comportamiento puede ser válido [2:55]. Pero cuando necesitas preservar el estado original, debes aplicar técnicas que garanticen inmutabilidad, como usar copy() antes de cualquier modificación.

Puntos clave para recordar:

  • Los tipos primitivos se pasan por valor; los diccionarios por referencia.
  • Usar copy() rompe la referencia y crea un diccionario independiente.
  • Decidir entre mutabilidad e inmutabilidad depende del comportamiento que busques en tu programa.

Si alguna vez te has preguntado por qué tu lista original cambia misteriosamente, ahora sabes que todo se reduce a cómo Python gestiona las referencias en memoria. Comparte en los comentarios si te gustaría profundizar más en este tema.