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.left
vide.
Réponses:
Qu'est-ce qui ne va pas
self.left = None
?la source
null
en PHP, dans la mesure où la définition d'une variablenull
en 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 deNone
en Python est très différente d'une variable non définie.None
est tout à fait comme la plupart des autres incarnationsnull
, cependant (jusqu'à ce que nous entrions dans des détails plus obscurs, au moins).None
que 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à.print x
et 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 duprint x
code produira le motNone
en sortie. Je suis nouveau sur python donc je peux me tromper, mais cela ne ressemble pas au comportement d'une variable effacée.Le
del
mot-clé ferait l'affaire.Mais dans ce cas, je vote pour
self.left = None
la source
del
pré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.type=…
lorsque vous vouliez taper, latype(…)
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.set = set(myList)
et puis j'ai réalisé que je ne pouvais plus utiliser set comme fonction (doh). L'utilisationdel set
m'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.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
None
serait mieux.la source
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:la source
clear
nonremove
. del va tuer l'attribut et les recherches. Il est beaucoup plus propre de le définir sur Aucun, que vous pouvez vérifierif self.left
et ce serait suffisant pour vérifier si un nœud est vide.del
, à mon humble avis, il est plus évident que la variable peut être oubliée lors de l'analyse mentale ' le code.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 ?Si vous souhaitez le supprimer totalement, utilisez
del
:del your_variable
Ou sinon, pour rendre la valeur
None
: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_variable
sera videla source
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!
la source
J'ai utilisé quelques options mentionnées ci-dessus:
ou en définissant la valeur sur Aucun en utilisant
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,
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:
La commande ci-dessus n'imprimera les valeurs que si self.left n'est pas
None
la source