如何在Python脚本中清除所有变量?

2024-03-29 08:58:59 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

以下命令序列确实会从当前模块中删除每个名称:

>>> import sys
>>> sys.modules[__name__].__dict__.clear()

我怀疑你真的想这么做,因为“每个名字”都包括所有内置的,所以在这样一个彻底的清除之后,你没什么可做的。记住,在Python中,实际上没有“变量”这样的东西——有许多类型的对象(包括模块、函数、类、数字、字符串等等),还有绑定到对象的名称;序列所做的是从模块中删除每个名称(当且仅当每次引用它们刚刚被移除)。

也许你想更有选择性,但很难准确地猜出你的意思,除非你想更具体些。但是,举个例子:

>>> import sys
>>> this = sys.modules[__name__]
>>> for n in dir():
...   if n[0]!='_': delattr(this, n)
... 
>>>

这个序列只留下私有或神奇的名称,包括包含所有内置名称的__builtins__特殊名称。所以,内置仍然有效——例如:

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'n']
>>> 

如您所见,名称n(该for中的控制变量)也碰巧会保留(因为它每次都在for子句中重新绑定),因此最好将该控制变量命名为_,例如,清楚地显示“它是特殊的”(另外,在交互式解释器中,名称_在提示符处输入的每个完整表达式之后都会重新绑定到该表达式的值,因此它不会长时间保留;-)。

不管怎样,一旦你确定了你想要做的是什么,就不难定义一个函数并把它放进你的启动文件(如果你只想在交互会话中使用)或者站点自定义文件(如果你想在每个脚本中使用)。

不,你最好重新启动解释器

IPython是捆绑式解释器的一个很好的替代品,它有通常工作的%reset命令

如果你写了一个函数,那么一旦你把它放在里面,所有的名字都会消失。

这个概念叫做namespace,它非常好,它把它变成了Zen of Python

Namespaces are one honking great idea -- let's do more of those!

IPython的名称空间同样可以用magic命令%reset -f重置。(这个-f的意思是“force”;换句话说,“不要问我是否真的想删除所有变量,只要做就行了。”)

相关问题 更多 >