La séquence de commandes suivante permet de supprimer chaque du module actuel :
>>> import sys
>>> sys.modules[__name__].__dict__.clear()
Je doute que vous souhaitiez réellement faire cela, car "chaque nom" inclut tous les build-ins, donc il n'y a pas grand chose que vous puissiez faire après un tel effacement total. Rappelez-vous qu'en Python, il n'existe pas vraiment de "variable" -- il y a des "variables". objets de nombreux types (y compris des modules, des fonctions, des classes, des nombres, des chaînes de caractères, etc. noms Cette séquence permet de supprimer tous les noms d'un module (les objets correspondants disparaissent si et seulement si toutes les références à ces objets ont été supprimées).
Vous voulez peut-être être plus sélectif, mais il est difficile de deviner ce que vous voulez dire exactement, à moins que vous ne vouliez être plus précis. Mais, juste pour donner un exemple :
>>> import sys
>>> this = sys.modules[__name__]
>>> for n in dir():
... if n[0]!='_': delattr(this, n)
...
>>>
Cette séquence laisse seuls les noms qui sont privés ou magiques, y compris le __builtins__
un nom spécial qui abrite tous les noms des modules intégrés. Ainsi, les built-ins fonctionnent toujours -- par exemple :
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'n']
>>>
Comme vous le voyez, le nom n
(la variable de contrôle dans cette for
) se trouve également à rester dans les parages (puisqu'elle est reliée à nouveau dans le fichier for
à chaque passage), il serait donc préférable de nommer cette variable de contrôle _
par exemple, pour montrer clairement "c'est spécial" (de plus, dans l'interpréteur interactif, le nom _
est de toute façon lié de nouveau après chaque expression complète entrée à l'invite, à la valeur de cette expression, de sorte qu'il ne restera pas longtemps en place;-).
Quoi qu'il en soit, une fois que vous avez déterminé exactement ce qu'il est que vous voulez faire, il n'est pas difficile de définir une fonction à cet effet et de la mettre dans votre fichier de démarrage (si vous ne le voulez que dans les sessions interactives) ou dans le fichier de personnalisation du site (si vous le voulez dans chaque script).
2 votes
Il serait utile que vous changiez votre titre en quelque chose comme "Comment puis-je effacer toutes les variables au milieu d'un script Python ?" pour les futures recherches sur le sujet, parce que "Comment redémarrer la fenêtre de commande en Python ?" n'a rien à voir avec ce que vous demandez réellement.
0 votes
Pouvez-vous fournir un contexte possible dans lequel cela a un sens ?
2 votes
Cela ressemble à un autre cas où l'on essaie de déplacer les habitudes de codage de leur environnement d'origine vers un environnement où elles n'ont aucun sens.
0 votes
Si vous ne vous préoccupez que de quelques objets massifs (images ou autres grands tableaux), vous pourriez
del
quand tu auras fini. Si vous êtes simplement inquiet de l'encombrement de l'espace de noms, vous devriez probablement reconsidérer votre conception en utilisant autant de noms. Par exemple, pour une série de transformations d'images, conserver chaque étape intermédiaire est probablement inutile.0 votes
"un script qui à un moment donné efface toutes les variables." Ça ressemble à deux script. Ou -- encore plus simplement -- deux fonctions ayant chacune des espaces de noms distincts. Pourquoi ce n'est pas simplement deux fonctions ?
4 votes
@S.Lott : analyse scientifique exploratoire dans une console. Il est courant de se retrouver avec de nombreuses variables non souhaitées (après avoir essayé des choses, puis décidé que ce n'est pas une voie pertinente). Mais dans ce cas, La réponse de John La Rooy est le plus approprié.
0 votes
@S.Lott En tant que scientifique, je dois souvent produire des graphiques ou exécuter la même analyse sur plusieurs fichiers différents. Est-ce que je veux réinitialiser manuellement le noyau à chaque fois, et relancer mon script en choisissant le nom du fichier à charger ? Non. Est-ce que je veux dupliquer mon script, en faire un pour chaque fichier différent que je veux utiliser ? Non. Est-ce que je veux tout mettre dans un grand for-loop et boucler sur une liste de noms de fichiers ? Évidemment. Et comme Python est extrêmement fragile, c'est une bonne pratique d'effacer toutes les variables entre deux exécutions pour être sûr de ne pas les "contaminer". Le fait que ce ne soit pas possible est assez ahurissant.