Creación de diccionarios y objetos mutables: comportamiento sorprendente con fromkeys
Al crear diccionarios usando dict.fromkeys() en Python, puede ocurrir una situación inesperada surgen cuando se emplean objetos mutables como valores. Considere el siguiente ejemplo:
xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)
A pesar de crear dos objetos de lista separados como valores para las claves del diccionario 0 y 1, agregar un elemento a la lista en el índice 0 también lo agrega a la lista en el índice 1. Esto ocurre porque fromkeys se vincula cada clave a la misma referencia del objeto mutable, lo que resulta en modificaciones compartidas.
Por el contrario, las comprensiones de diccionario en Python 3.2 exhiben diferentes comportamiento:
xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)
Aquí, cada clave está vinculada a un objeto de lista distinto. Agregar un elemento a la lista en el índice 0 no afecta la lista en el índice 1.
¿Por qué la diferencia?
El comportamiento de las claves from se puede entender considerando el siguiente código equivalente:
a = []
xs = dict.fromkeys(range(2), a)
Cada clave en el diccionario resultante hace referencia al mismo objeto, lo que lleva a las modificaciones compartidas observadas.
Para lograr el comportamiento deseado de objetos mutables distintos para cada clave, use comprensiones de diccionario o, para Python 2.6 y versiones anteriores sin comprensiones de diccionario, use dict() con un generador expresión:
xs = dict((i, []) for i in range(2))
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3