Existe uma maneira de limpar o valor de uma variável em python?
Por exemplo, se eu estivesse implementando uma árvore binária:
Class Node:
self.left = somenode1
self.right = somenode2
Se eu quisesse remover algum nó da árvore, precisaria definir self.left
como vazio.
Respostas:
O que há de errado
self.left = None
?fonte
null
no PHP, pois definir uma variávelnull
no PHP oferece um comportamento semelhante na maioria dos casos, como se você não tivesse definido em primeiro lugar. Um valor deNone
em Python é bem diferente de uma variável indefinida.None
é como a maioria das outras encarnações denull
, no entanto (até entrarmos em detalhes mais misteriosos, pelo menos).None
que puder com qualquer outro objeto "simples" de tipo não especificado: armazene-o em contêineres, imprima uma representação de string, verifique alguns metadados ... De qualquer forma, você tentou o Google por "python null equivalente"? Estou falando sério; será preciso um pouco de análise, mas as informações estão aí.print x
e pressione enter. Isso produzirá um erro de intérprete, assim como a maioria dos idiomas quando você tenta imprimir uma variável indefinida. Mas se você definir a variável e tentar limpá-la com Nenhum, o uso doprint x
código produzirá a palavraNone
como saída. Eu sou novo em python, então posso estar enganado, mas isso não parece o comportamento de uma variável limpa.A
del
palavra-chave serviria.Mas neste caso eu voto em
self.left = None
fonte
del
também tem a desvantagem de que, se você tentar excluir uma variável que não existe, ela gera uma exceção, o que geralmente é indesejável.type=…
quando você quis digitartype(…)
e excluí-la, é a maneira mais fácil de recuperar a funcionalidade original. Ou seja, se você mantê-lo como Nenhum, você ainda estará cortando o acesso à função subjacente.set = set(myList)
e então percebi que não podia mais usar o set como uma função (doh). Usardel set
me permitiu usá-lo novamente como uma taxa de câmbio. É claro que eu nunca usaria esse var reservado em um script real.var = None
"limpa o valor", configurando o valor da variável para "nulo", como o valor de "Nenhum", no entanto, o ponteiro para a variável permanece.del var
remove totalmente a definição da variável.Caso você queira usar a variável posteriormente, por exemplo, defina um novo valor para ela, ou seja, retenha a variável,
None
seria melhor.fonte
Na verdade, isso não exclui a variável / propriedade. Tudo o que ele fará é definir seu valor como
None
, portanto, a variável ainda ocupará espaço na memória. Se você deseja limpar completamente toda a existência da variável da memória, basta digitar:fonte
clear
nãoremove
. del matará o atributo e as pesquisas. É muito mais fácil configurá-lo como Nenhum, do que você pode verificarif self.left
e isso seria bom o suficiente para verificar se um nó está vazio.del
, IMHO, torna mais óbvio que a variável pode ser esquecida ao analisar mentalmente ' o código.if self.left:
ou prefere lidar com uma possível exceção de NameError que interromperá o programa se você não o manipular em todos os lugares ?Se quiser excluí-lo totalmente, use
del
:del your_variable
Ou então, para tornar o valor
None
:your_variable = None
Se for iterável (como uma lista ou tupla), você pode deixá-lo vazio como:
your_variable.clear()
Então
your_variable
estará vaziofonte
Deseja excluir uma variável, não é?
ok, acho que tenho uma melhor ideia alternativa para a resposta @bnul:
Você pode excluir nomes individuais com
del
:del x
ou você pode removê-los do objeto globals ():for name in dir(): if not name.startswith('_'): del globals()[name]
Este é apenas um exemplo de loop; defensivamente, apenas exclui nomes que não começam com um sublinhado, assumindo (sem razão) que você usou apenas nomes sem sublinhado no início do intérprete. Você pode usar uma lista de nomes codificada para manter (lista de permissões) se realmente quiser ser aprofundada. Não há nenhuma função interna para fazer a limpeza para você, além de sair e reiniciar o intérprete.
Os módulos que você importou (import os) permanecerão importados porque são referenciados por sys.modules; as importações subsequentes reutilizarão o objeto do módulo já importado. Você simplesmente não terá uma referência a eles no seu namespace global atual.
Por favor, reconsidere esta resposta!
fonte
Eu usei algumas opções mencionadas acima:
ou definindo o valor como None usando
É importante conhecer as diferenças e colocar alguns manipuladores de exceção quando você usa o valor definido como Nenhum. Se você estiver imprimindo o valor das instruções condicionais usando um modelo, digamos,
você pode ver o valor da variável imprimindo "O valor da variável é Nenhum". Assim, você teria que colocar alguns manipuladores de exceção lá:
O comando acima só imprimirá valores se self.left não for
None
fonte