我正在寻找与Matlab中的“清除”类似的东西:一种命令/函数,该命令/函数从工作区中删除所有变量,并将其从系统内存中释放出来。Python中有这样的事情吗?
编辑:我想写一个脚本,在某个时候清除所有变量。
我正在寻找与Matlab中的“清除”类似的东西:一种命令/函数,该命令/函数从工作区中删除所有变量,并将其从系统内存中释放出来。Python中有这样的事情吗?
编辑:我想写一个脚本,在某个时候清除所有变量。
del在完成后使用它们。如果您只是担心名称空间混乱,则可能应该使用这么多名称重新考虑设计。例如,对于一系列图像变换,可能不需要保留每个过渡步骤。
Answers:
以下命令序列确实从当前模块中删除了每个名称:
>>> 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每次都会在子句中重新绑定),因此最好为该控制变量命名_(例如,清楚地显示“它是特殊”(此外,在交互式解释器中,_在提示符处输入的每个完整表达式之后,名称都必须重新绑定到该表达式的值,因此不会持续很长时间;-)。
无论如何,一旦你已经确定到底是什么是你想做的事,这不是很难定义的功能为目的,并把它放在你的启动文件(如果你只在互动环节希望它)或网站-自定义文件(如果您想在每个脚本中使用它)。
int = (2).__class__,str = ''.__class__,True = (1 == 1)等...
for n in dir(): ... if n[0]!='_': delattr(this, n)在某个时候使用n=this它并在循环中将其删除时!因此,在下一次迭代中,您会尝试尝试错误,delattr(this,n)因为您刚刚将其删除!:)因此无法正常工作
不,您最好重新启动解释器
IPython是捆绑式解释器的理想替代品,并且具有%reset通常有效的命令
ctrl-d然后pyt- >tab重新进入解释。没有理由在这里做任何事情。
%reset -f非交互式。stackoverflow.com/questions/38798181/…–
这是亚历克斯答案的修改版本。我们可以使用以下2种方法保存模块名称空间的状态并进行还原...
__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的clear一样工作。
names = list(sys.modules[__name__].__dict__.keys()),否则Python将抱怨您在遍历dict_keys对象时更改了字典大小。
import这个答案的人(例如,我已经保存了这个问题,并且从Jupyter笔记本中导入了这个问题,以清除作业中不同问题之间的命名空间),我想你应该使用"__main__"而不是__name__。
该globals()函数返回一个字典,其中的键是可以命名的对象的名称(顺便说一句,值是id这些对象的)。该exec()函数接受一个字符串并执行它,就像在python控制台中键入它一样。所以,代码是
for i in list(globals().keys()):
if(i[0] != '_'):
exec('del {}'.format(i))