"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que `dict.fromkeys()` cria objetos mutáveis ​​​​compartilhados em Python?

Por que `dict.fromkeys()` cria objetos mutáveis ​​​​compartilhados em Python?

Publicado em 2024-11-08
Navegar:901

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

Criação de dicionário e objetos mutáveis: comportamento surpreendente com fromkeys

Ao criar dicionários usando dict.fromkeys() em Python, uma situação inesperada pode surgem quando objetos mutáveis ​​são empregados como valores. Considere o seguinte exemplo:

xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)

Apesar de criar dois objetos de lista separados como valores para as chaves de dicionário 0 e 1, adicionar um elemento à lista no índice 0 também o adiciona à lista no índice 1. Isso ocorre porque fromkeys se liga cada chave para a mesma referência do objeto mutável, resultando em modificações compartilhadas.

Em contraste, as compreensões de dicionário em Python 3.2 exibem um comportamento diferente:

xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)

Aqui, cada chave está vinculada a um objeto de lista distinto. Acrescentar um elemento à lista no índice 0 não afeta a lista no índice 1.

Por que a diferença?

O comportamento de fromkeys pode ser entendido considerando o seguinte código equivalente:

a = []
xs = dict.fromkeys(range(2), a)

Cada chave no dicionário resultante faz referência ao mesmo objeto, levando às modificações compartilhadas observadas.

Para alcançar o comportamento desejado de objetos mutáveis ​​distintos para cada chave, use compreensões de dicionário ou, para Python 2.6 e anteriores sem compreensões de dicionário, use dict() com uma expressão geradora:

xs = dict((i, []) for i in range(2))
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3