Em python, existe uma diferença entre chamar clear()
e atribuir {}
a um dicionário? Se sim, o que é isso? Exemplo:
d = {"stuff":"things"}
d.clear() #this way
d = {} #vs this way
python
dictionary
Marcin
fonte
fonte
Respostas:
Se você tiver outra variável também se referindo ao mesmo dicionário, há uma grande diferença:
Isso ocorre porque a atribuição
d = {}
cria um novo dicionário vazio e o atribui àd
variável. Isso deixad2
apontar para o dicionário antigo com itens ainda nele. No entanto,d.clear()
limpa o mesmo dicionário qued
ed2
ambos apontam para.fonte
d = {}
criará uma nova instância para,d
mas todas as outras referências ainda apontarão para o conteúdo antigo.d.clear()
redefinirá o conteúdo, mas todas as referências à mesma instância ainda estarão corretas.fonte
Além das diferenças mencionadas em outras respostas, também há uma diferença de velocidade. d = {} é duas vezes mais rápido:
fonte
d = {}
deve ser mais rápida, pois a limpeza de todo pode ser deixada para o Garbage Collector para mais tarde.Como ilustração para as coisas já mencionadas anteriormente:
fonte
.clear
modifica o objeto, mas `= {}` cria um novo objeto.Além da resposta do @odano, parece que o uso
d.clear()
é mais rápido se você quiser limpar o ditado por muitas vezes.O resultado é:
fonte
Os métodos de mutação são sempre úteis se o objeto original não estiver no escopo:
Reatribuir o dicionário criaria um novo objeto e não modificaria o original.
fonte
Uma coisa não mencionada são os problemas de escopo. Não é um ótimo exemplo, mas aqui está o caso em que me deparei com o problema:
A solução é substituir
c_kwargs = {}
porc_kwargs.clear()
Se alguém pensar em um exemplo mais prático, fique à vontade para editar esta postagem.
fonte
global c_kwargs
provavelmente também funcionaria não? Embora provavelmenteglobal
não seja a melhor coisa para se usar muito.global
faria a função se comportar de maneira diferente - todas as chamadas para conf_decorator compartilhariam a mesma variável c_kwargs. Acredito que o Python 3 adicionou anonlocal
palavra-chave para resolver esse problema, e isso funcionaria.Além disso, às vezes a instância dict pode ser uma subclasse de dict (
defaultdict
por exemplo). Nesse caso,clear
é preferível usar , pois não precisamos lembrar o tipo exato do ditado e também evitar código duplicado (acoplando a linha de limpeza com a linha de inicialização).fonte