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))
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