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

时间:2010-08-22 23:05:07

标签: python clear

我在Matlab中寻找类似于'clear'的东西:一个命令/函数,它从工作区中删除所有变量,从系统内存中释放它们。 Python中有这样的东西吗?

编辑:我想编写一个脚本,在某些时候清除所有变量。

8 个答案:

答案 0 :(得分:46)

不,你最好重新启动翻译

Ipython是捆绑式解释器的绝佳替代品,并且%reset命令通常可以使用

答案 1 :(得分:45)

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

>>> 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子句中重新绑定),所以例如,将控制变量命名为_可能更好,以清楚地显示“它是特殊的”(另外,在交互式解释器中,名称_无论如何在输入的每个完整表达式后重新绑定。提示,到该表达式的值,所以它不会长时间停留; - )。

无论如何,一旦你确定你想要做什么 ,就不难为此目的定义一个函数并将它放在你的启动文件中(如果你只想要它)在交互式会话中)或站点自定义文件(如果你想在每个脚本中使用它)。

答案 2 :(得分:26)

如果你写了一个函数,那么一旦你离开它,所有的名字都会消失。

这个概念被称为namespace,它非常好,它进入了Zen of Python

  

命名空间是一个很棒的主意    - 让我们做更多的事情!

同样可以使用魔术命令%reset -f重置IPython的命名空间。 (-f表示“强制”;换句话说,“不要问我是否真的要删除所有变量,只需这样做。”

答案 3 :(得分:4)

from IPython import get_ipython;   
get_ipython().magic('reset -sf')

答案 4 :(得分:3)

这是Alex答案的修改版本。 我们可以保存模块命名空间的状态,并使用以下两种方法恢复它......

__saved_context__ = {}

def saveContext():
    import sys
    __saved_context__.update(sys.modules[__name__].__dict__)

def restoreContext():
    import sys
    names = sys.modules[__name__].__dict__.keys()
    for n in names:
        if n not in __saved_context__:
            del sys.modules[__name__].__dict__[n]

saveContext()

hello = 'hi there'
print hello             # prints "hi there" on stdout

restoreContext()

print hello             # throws an exception

您还可以在调用saveContext()之前添加一行“clear = restoreContext”,而clear()将像matlab一样清晰。

答案 5 :(得分:0)

在空闲的IDE中有Shell / Restart Shell。 Cntrl-F6会做到的。

答案 6 :(得分:0)

globals()函数返回一个字典,其中键是可以命名的对象的名称(顺便说一下,值是这些对象的idexec()函数接受一个字符串并执行它,就像您在python控制台中键入它一样 所以,代码是

for i in list(globals().keys()):
    exec('del {}'.format(i)) if i[0] != '_' else None

此处添加了else None以遵循python语法。这段代码看起来并不漂亮,但是很短。更好的书写方式是

for i in list(globals().keys()):
    if(i[0] != '_'):
        exec('del {}'.format(i))

答案 7 :(得分:0)

创建包含所有必需变量的类不是最简单的方法吗? 然后,您有一个包含所有curretn变量的对象,如果需要,您可以覆盖此变量?