Objetivo: aprender a copiar un diccionario en Python, evitando referencias al mismo objeto.
Al igual que las listas, los diccionarios, como sabes, tienen cosquillas (no son inmutables). Padecen el mismo problema que aquéllas a la hora de copiarlas: podemos obtener referencias al mismo objeto que, si no somos cuidadosos, pueden llevarnos a un buen quebradero de cabeza.
Observa el fenómeno:
>>> x = {'manzana':'verde', 'plátano':'amarillo'}
>>> y = x
>>> y
{'plátano': 'amarillo', 'manzana': 'verde'}
Aparentemente, aunque x e y tengan el mismo valor, se trataría de objetos distintos y cada uno podría vivir, desde este momento, su propia vida independiente. Al menos, eso es lo que esperaríamos en otros lenguajes de programación.
Pero no es así, uno de los grandes atractivos de Python: x e y no son más que dos collares en el mismo perro.
>>> y is x
True
De hecho, si modificamos x, los cambios también se reflejan en y:
>>> x['fresa'] = 'roja'
>>> y
{'fresa': 'roja', 'plátano': 'amarillo', 'manzana': 'verde'}
Entonces, ¿cuál es el modo correcto de obtener un duplicado independiente de un diccionario?
Los diccionarios tienen una inmesa colección de metodos que, poco a poco, conviene ir aprendiendo. Uno de ellos, copy(), soluciona nuestro problema:
>>> z = x.copy()
>>> z
{'fresa': 'roja', 'plátano': 'amarillo', 'manzana': 'verde'}
La variable z apunta a un duplicado de x, pero observa que ahora son objetos distintos:
>>> z is x
False
Si modificamos x podemos comprobar que z no se ve afectada:
>>> del x['plátano']
>>> x
{'fresa': 'roja', 'manzana': 'verde'}
>>> z
{'fresa': 'roja', 'plátano': 'amarillo', 'manzana': 'verde'}
Habríamos llegado al mismo resultado a través de la función dict(), empleada para construir diccionarios:
>>> z = dict(x)
Hablaremos de dict() con mucho más detalle más adelante. Quédate, hasta entonces, con estos dos modos de duplicar diccionarios.
Observa que la variable y, copia burda de x, se ha quedado sin su tan rico en potasio plátano.
>>> y
{'fresa': 'roja', 'manzana': 'verde'}
Se lo merece, ¡esto es Python!
Javier Montero Gabarró
El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)
El Club del Autodidacta
Consulta el índice completo de artículos relacionados con Python.