Manejo de referencias en memoria con diccionarios y map en Python
Curso de Python: Comprehensions, Funciones y Manejo de Errores
Contenido del curso
Conjuntos
Comprehensions
- 6

List Comprehension en Python: Sintaxis y Ejemplos Prácticos
08:44 min - 7

Comprensión de Diccionarios en Python: Ejemplos y Aplicaciones
11:57 min - 8

Dictionary Comprehension con Condicionales en Python
07:33 min - 9

Playgrounds: Crea una lista usando List Comprehension
- 10

Comparación de Listas, Tuplas y Conjuntos en Python
02:44 min
Funciones
- 11

Funciones en Programación: Creación y Uso en Python
09:47 min - 12

Funciones en Python: Retorno de Valores y Reutilización de Código
10:03 min - 13

Funciones en Python: Retorno múltiple y valores por defecto
06:30 min - 14

Entendiendo el Scope en Python: Variables y Funciones
07:54 min - 15

Refactorización de Juegos en Python: Uso de Funciones
15:10 min - 16

Playgrounds: Tienda de Tecnología
- 17

Funciones Lambda en Python: Sintaxis y Aplicaciones Prácticas
06:39 min - 18

Funciones de Orden Superior en Python: Concepto y Ejemplos Prácticos
08:48 min - 19

Uso de la función map en Python para transformar listas
08:43 min - 20

Transformaciones con Map en Diccionarios Complexos
09:56 min - 21

Manejo de referencias en memoria con diccionarios y map en Python
Viendo ahora - 22

Playgrounds: Multiplica todos los elementos por dos
- 23

Filtrado de listas con Filter en Python
09:19 min - 24

Playgrounds: Retorna solo palabras de 4 letras y más
- 25

Uso de Reduce en Python para Manipular Listas
07:45 min
Módulos
Manipulación de archivos y errores
- 31

Control manual de iteradores en Python con next
06:33 min - 32

Errores y Excepciones en Python: Identificación y Manejo Básico
08:28 min - 33

Manejo de Errores en Python: Uso de Try y Except
08:17 min - 34

Playgrounds: Captura la excepción: ZeroDivisionError
- 35

Lectura y manejo de archivos de texto en Python
06:52 min - 36

Lectura y escritura de archivos de texto en Python
06:11 min - 37

Procesamiento de Archivos CSV en Python para Análisis de Datos
15:49 min - 38

Playgrounds: Lee un CSV para calcular el total de gastos
Gráficas en Python
Próximos pasos
Manejo de referencias en memoria con diccionarios y map en Python
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_itemno 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.