"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué `dict.fromkeys()` crea objetos mutables compartidos en Python?

¿Por qué `dict.fromkeys()` crea objetos mutables compartidos en Python?

Publicado el 2024-11-08
Navegar:465

 Why does `dict.fromkeys()` create shared mutable objects in Python?

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))
Último tutorial Más>

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