Effacer la variable en python

207

Existe-t-il un moyen d'effacer la valeur d'une variable en python?

Par exemple, si j'implémentais un arbre binaire:

Class Node:
    self.left = somenode1
    self.right = somenode2

Si je voulais supprimer un nœud de l'arborescence, je devrais définir la valeur self.leftvide.

Bnicholas
la source
Duplication possible de Y a
Richard Möhn

Réponses:

157

Qu'est-ce qui ne va pas self.left = None?

bnaul
la source
19
Pas familier avec le mot-clé None. Est-ce similaire à null dans d'autres langues?
Bnicholas
6
Oui; c'est équivalent à null.
Smashery
12
@Bnicholas Cependant, ce n'est pas comme nullen PHP, dans la mesure où la définition d'une variable nullen PHP vous donne un comportement similaire dans la plupart des cas, comme si vous ne l'aviez pas défini en premier lieu. Une valeur de Noneen Python est très différente d'une variable non définie. Noneest tout à fait comme la plupart des autres incarnations null, cependant (jusqu'à ce que nous entrions dans des détails plus obscurs, au moins).
Ben
Ce n'est pas un mot-clé; c'est un nom défini par défaut pour un objet intégré. Vous pouvez faire n'importe quoi avec ce Noneque vous pouvez faire avec n'importe quel autre objet "ordinaire" de type non spécifié: le stocker dans des conteneurs, en imprimer une représentation sous forme de chaîne, vérifier certaines métadonnées dessus ... Quoi qu'il en soit, avez-vous essayé Google pour "python null équivalent"? Je suis serieux; cela prendra un peu d'analyse, mais l'information est là.
Karl Knechtel
18
Ouvrez le terminal python et tapez print xet appuyez sur Entrée. Cela produira une erreur d'interpréteur, comme le font la plupart des langues lorsque vous essayez d'imprimer une variable non définie. Mais si vous définissez la variable, puis essayez de l'effacer avec None, l'utilisation du print xcode produira le mot Noneen sortie. Je suis nouveau sur python donc je peux me tromper, mais cela ne ressemble pas au comportement d'une variable effacée.
Musixauce3000
408

Le delmot-clé ferait l'affaire.

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

Mais dans ce cas, je vote pour self.left = None

affamé
la source
18
Parfois, cela ne le supprime pas entièrement, cela supprime uniquement cette référence à un en mémoire. Cela peut laisser des variables fantômes en mémoire qui n'obtiennent pas gc.
Jakob Bowyer
4
delprésente également l'inconvénient que si vous essayez de supprimer une variable qui n'existe pas, elle génère une exception, ce qui n'est généralement pas souhaitable.
Philip Kearns
33
Je voulais juste souligner que si vous avez accidentellement déclaré une variable qui écrase les commandes intégrées, par exemple, type=… lorsque vous vouliez taper, la type(…)supprimer est le moyen le plus simple de récupérer la fonctionnalité d'origine. Autrement dit, si vous le conservez comme Aucun, vous couperez toujours l'accès à la fonction sous-jacente.
mpacer
2
Collecte des ordures / Collecteur / Recueilli
mccc
1
C'était celui que je cherchais. En jouant sur la ligne cmd, j'avais ... set = set(myList)et puis j'ai réalisé que je ne pouvais plus utiliser set comme fonction (doh). L'utilisation del setm'a permis de l'utiliser à nouveau comme fx. Bien sûr, je n'utiliserais jamais cette var réservée dans un script réel.
jbchurchill
111

var = None "efface la valeur", définissant la valeur de la variable sur "null" comme la valeur de "None", mais le pointeur vers la variable reste.

del var supprime totalement la définition de la variable.

Si vous souhaitez utiliser la variable plus tard, par exemple, définissez-lui une nouvelle valeur, c'est-à-dire conservez la variable, ce Noneserait mieux.

user11788
la source
Que faire si je souhaite supprimer complètement une variable qui, dans certaines circonstances, n'existe pas. Y a-t-il un paramètre pour éviter une erreur? J'ai besoin de supprimer plusieurs variables: del a, b, c, d Je pourrais utiliser la boucle et essayer / excepté, mais je préfère un commutateur pour l'éviter.
Tedo Vrbanec
63

En fait, cela ne supprime pas la variable / propriété. Tout ce qu'il fera est de définir sa valeur sur None, donc la variable prendra toujours de la place en mémoire. Si vous voulez effacer complètement toute existence de la variable de la mémoire, vous pouvez simplement taper:

del self.left
Viraj Shah
la source
8
Je ne comprends pas pourquoi la réponse = None est si populaire. C'est la bonne réponse
Nikolay Gromov
1
Le PO a dit clearnon remove. del va tuer l'attribut et les recherches. Il est beaucoup plus propre de le définir sur Aucun, que vous pouvez vérifier if self.leftet ce serait suffisant pour vérifier si un nœud est vide.
user1767754
"Il est beaucoup plus propre de le régler sur Aucun" - il convient de considérer que si quelqu'un (vous-même quelque temps plus tard ou un collaborateur) lit le code del, à mon humble avis, il est plus évident que la variable peut être oubliée lors de l'analyse mentale ' le code.
Pocketsand
1
@NikolayGromov dans votre code au jour le jour, lorsque vous voulez obtenir la valeur de self.left préférez-vous vérifier if self.left:, ou préférez-vous gérer une éventuelle exception NameError qui plantera votre programme si vous ne le gérez pas partout ?
Pierre.Sassoulas
33
  • Si vous souhaitez le supprimer totalement, utilisez del:

    del your_variable

  • Ou sinon, pour rendre la valeurNone :

    your_variable = None

  • S'il s'agit d'un itérable (comme une liste ou un tuple), vous pouvez le rendre vide comme:

    your_variable.clear()

Alors your_variablesera vide

U10-Forward
la source
Pour la deuxième option, "effacer son contenu" n'est pas correct, cela ne fera que réaffecter la variable à None, l'objet d'origine restera toujours (sauf si son nombre de références est réduit à zéro, auquel cas il est récupéré).
cs95
0

Voulez-vous supprimer une variable, n'est-ce pas?

ok, je pense que j'ai une meilleure idée alternative à @bnul réponse:

Vous pouvez supprimer des noms individuels avec del:

del x ou vous pouvez les supprimer de l'objet globals ():

for name in dir(): if not name.startswith('_'): del globals()[name]

Ce n'est qu'un exemple de boucle; il supprime défensivement uniquement les noms qui ne commencent pas par un trait de soulignement, faisant l'hypothèse (non déraisonnable) que vous n'avez utilisé que des noms sans trait de soulignement au début dans votre interpréteur. Vous pouvez utiliser une liste de noms codée en dur à conserver à la place (liste blanche) si vous voulez vraiment être approfondi. Il n'y a pas de fonction intégrée pour faire l'effacement pour vous, à part quitter et redémarrer l'interpréteur.

Les modules que vous avez importés (import os) vont rester importés car ils sont référencés par sys.modules; les importations suivantes réutiliseront l'objet de module déjà importé. Vous n'aurez simplement aucune référence à eux dans votre espace de noms global actuel.

Veuillez reconsidérer cette réponse!

Federico Migueletto
la source
-1

J'ai utilisé quelques options mentionnées ci-dessus:

del self.left

ou en définissant la valeur sur Aucun en utilisant

self.left = None

Il est important de connaître les différences et de mettre en place quelques gestionnaires d'exceptions lorsque vous utilisez la valeur None. Si vous imprimez la valeur des instructions conditionnelles à l'aide d'un modèle, par exemple,

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

vous pourriez voir la valeur de la variable afficher "La valeur de la variable est Aucune". Ainsi, vous devrez y mettre quelques gestionnaires d'exceptions:

if self.left:
    #Then only print stuff

La commande ci-dessus n'imprimera les valeurs que si self.left n'est pas None

Navneet Kumar
la source