Limpar variável em python


207

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.leftcomo vazio.


Respostas:


157

O que há de errado self.left = None?


19
Não estou familiarizado com a palavra-chave Nenhuma. Isso é semelhante ao null em outros idiomas?
Bnicholas 23/11

6
Sim; é equivalente a nulo.
Smashery 23/11

12
@Bnicholas No entanto, não é como nullno PHP, pois definir uma variável nullno PHP oferece um comportamento semelhante na maioria dos casos, como se você não tivesse definido em primeiro lugar. Um valor de Noneem Python é bem diferente de uma variável indefinida. Noneé como a maioria das outras encarnações de null, no entanto (até entrarmos em detalhes mais misteriosos, pelo menos).
Ben

Não é uma palavra-chave; é um nome definido por padrão para um objeto interno. Você pode fazer qualquer coisa Noneque 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í.
precisa

18
Abra o terminal python, digite print xe 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 do print xcódigo produzirá a palavra Nonecomo saída. Eu sou novo em python, então posso estar enganado, mas isso não parece o comportamento de uma variável limpa.
Musixauce3000

408

A delpalavra-chave serviria.

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

Mas neste caso eu voto em self.left = None


18
às vezes isso não o remove completamente, apenas remove essa referência a um na memória. Isso pode deixar variáveis ​​fantasmas na memória que não recebem o gc.
Jakob Bowyer 23/11

4
deltambé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.
Philip Kearns

33
Eu só queria salientar que se você acidentalmente declarou uma variável que está substituindo comandos incorporados, por exemplo, type=… quando você quis digitar type(…)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.
mpacer

2
Coleta de Lixo / Coletor / Coletado
mccc

1
Era o que eu estava procurando. Tocando na linha cmd, eu tinha ... set = set(myList)e então percebi que não podia mais usar o set como uma função (doh). Usar del setme permitiu usá-lo novamente como uma taxa de câmbio. É claro que eu nunca usaria esse var reservado em um script real.
precisa saber é o seguinte

111

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, Noneseria melhor.


E se eu quiser excluir completamente a variável que, em algumas circunstâncias, não existe. Existe algum parâmetro para evitar um erro? Eu preciso excluir várias variáveis: del a, b, c, d Eu poderia usar loop e try / except, mas prefiro alguma opção para evitá-lo.
Tedo Vrbanec

63

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:

del self.left

8
Não entendo por que a resposta = None é tão popular. Esta é a resposta correta
Nikolay Gromov

1
O OP disse que clearnão remove. del matará o atributo e as pesquisas. É muito mais fácil configurá-lo como Nenhum, do que você pode verificar if self.lefte isso seria bom o suficiente para verificar se um nó está vazio.
precisa saber é o seguinte

"É muito mais fácil defini-lo como None" - vale a pena considerar que se alguém (você mesmo algum tempo depois ou um colaborador) estiver lendo o código del, IMHO, torna mais óbvio que a variável pode ser esquecida ao analisar mentalmente ' o código.
Pocketsand

1
@NikolayGromov no seu código do dia a dia, quando você deseja obter o valor de self.left, você prefere verificar 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 ?
Pierre.Sassoulas

33
  • Se quiser excluí-lo totalmente, use del:

    del your_variable

  • Ou então, para tornar o valorNone :

    your_variable = None

  • Se for iterável (como uma lista ou tupla), você pode deixá-lo vazio como:

    your_variable.clear()

Então your_variableestará vazio


Para a segunda opção, "limpar seu conteúdo" não está correto, isso apenas reatribuirá a variável a Nenhum, o objeto original ainda permanecerá (a menos que sua contagem de referência se reduz a zero, caso em que é coletada de lixo).
cs95

0

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!


-1

Eu usei algumas opções mencionadas acima:

del self.left

ou definindo o valor como None usando

self.left = None

É 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,

print("The value of the variable is {}".format(self.left))

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á:

if self.left:
    #Then only print stuff

O comando acima só imprimirá valores se self.left não for None

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.