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

sna*_*ile 71 python clear

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

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

Ale*_*lli 53

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

>>> import sys
>>> sys.modules[__name__].__dict__.clear()
Run Code Online (Sandbox Code Playgroud)

我怀疑你实际上是否想要这样做,因为"每个名字"都包含所有内置插件,因此在完全消除之后你无能为力.请记住,在Python中实际上没有"变量"这样的东西 - 有许多种类的对象(包括模块,函数,类,数字,字符串......),还有绑定到对象的名称 ; 序列的作用是从模块中删除每个名称(当且仅当对它们的每个引用都被删除时,相应的对象才会消失).

也许你想要更具选择性,但除非你想要更具体,否则很难准确猜出你的意思.但是,举一个例子:

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

此序列仅保留私有或神奇的__builtins__名称,包括包含所有内置名称的特殊名称.因此,内置函数仍然有效 - 例如:

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'n']
>>> 
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,name n(其中的控制变量for)也会碰巧(因为它for每次都在子句中重新绑定),所以命名控制变量可能更好_,例如,清楚地显示"它是特殊的"(另外,在交互式解释器中,名称_在提示符输入的每个完整表达式后仍然重新绑定到该表达式的值,因此它不会长时间保持;-).

无论如何,一旦你已经确定到底是什么你想做的事,这不是很难定义的功能为目的,并把它放在你的启动文件(如果你只在互动环节希望它)或网站-自定义文件(如果你想在每个脚本中使用它).

  • 你是对的.我不应该这样做.谢谢. (3认同)
  • 哈哈,这很精彩......令人惊讶的是你通过这样做会失去多少功能,但是你可以通过做一些像`int =(2).__ class__`,`str =''.__ class__这样的功能来获得多少功能. ,'真=(1 == 1)`等...... (3认同)
  • 那么你可以在启动时始终保留原始字典的副本,然后删除已添加的名称;)但是我认为这是对动态系统的明显滥用,我想不出一个非毫无意义的情况这样做在. (2认同)
  • 我越用Python,就越喜欢它.它不仅是一种很棒的语言,你还可以花几个小时简单地摆弄它并让它做你真的不应该做的事情;-) (2认同)

Joh*_*ooy 50

不,你最好重新启动翻译

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

  • +1:对于我来说,ctrl-d`然后`pyt`->`tab`返回解释器需要不到四分之一秒.没理由在这里做任何事. (5认同)
  • 你所说的“不”是指我不应该这样做或者这是不可能的?如果你说我不应该这样做,你能解释一下为什么吗? (3认同)
  • %reset适用于大多数变量,有些则无效。对我来说,只有重新启动解释器才能保证清理所有内容。 (2认同)
  • 使用'%reset -f`是非交互式的./sf/ask/2715872701/ (2认同)

Joc*_*zel 26

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

这个概念被称为命名空间,它非常好,它使它成为Python禅宗:

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

同样可以使用magic命令重置IPython的命名空间%reset -f.(-f意思是"强制";换句话说,"不要问我是否真的要删除所有变量,只要这样做.")


Anu*_*pta 6

from IPython import get_ipython;   
get_ipython().magic('reset -sf')
Run Code Online (Sandbox Code Playgroud)

  • 或者简单地“%reset -sf” (3认同)
  • 请看看[answer] (2认同)
  • 实际上,当您使用 anaconda 提示符运行 python 脚本时, %reset -sf 命令不起作用并引发错误(即使您使用了 try- except;它不起作用)。你可以尝试同样的方法,你就会看到。但是,使用 ipython 库将在任何可能的情况下解决这个问题。 (2认同)

Jug*_*Jug 5

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

__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
Run Code Online (Sandbox Code Playgroud)

您还可以在调用 saveContext() 之前添加一行“clear = restoreContext”,并且 clear() 将像 matlab 的 clear 一样工作。

  • 很好的答案!我相信对于Python 3你会想要用`names = list(sys.modules[__name__].__dict__.keys())`来调整restoreContext,否则Python会抱怨你在迭代它时改变了字典大小` dict_keys` 对象。 (2认同)