有没有办法从解释器的内存中删除创建的变量,函数等?

时间:2014-10-24 09:20:33

标签: python memory-management dir

我几天来一直在寻找这个问题的准确答案但是没有任何好处。我不是一个完整的编程初学者,但还不是中级水平。

当我在Python的shell中时,我输入:dir()我可以看到当前范围(主要块)中所有对象的所有名称,其中有6个:

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']

然后,当我声明一个变量时,例如x = 10,它会自动添加到内置模块dir()下的对象列表中,当我再次键入dir()时,它现在显示:

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']

功能,类等也是如此。

如何在不删除开头可用的标准6的情况下删除所有这些新对象?

我在这里读过“内存清理”,“清理控制台”,它会从命令提示符窗口中删除所有文本:

>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()

但这一切与我想要实现的目标无关,它并没有清除所有使用过的物体。

7 个答案:

答案 0 :(得分:104)

您可以使用del删除个人姓名:

del x

或者您可以从globals()对象中删除它们:

for name in dir():
    if not name.startswith('_'):
        del globals()[name]

这只是一个示例循环;它在防御上只删除了不以下划线开头的名称,这使得(非非无理的)假设您在解释器的开头只使用了没有下划线的名称。如果您真的想彻底,可以使用硬编码的名称列表(白名单)。除了退出并重新启动解释器之外,没有内置函数可以为您清除。

您导入的模块(import os)将继续导入,因为它们由sys.modules引用;后续导入将重用已导入的模块对象。您只是在当前的全局命名空间中没有对它们的引用。

答案 1 :(得分:41)

是。有一种简单的方法可以删除iPython中的所有内容。 在iPython控制台中,只需输入:

%reset

然后系统会要求您确认。按y。 如果您不想看到此提示,只需键入:

%reset -f

这应该有用..

答案 2 :(得分:7)

您可以使用python垃圾收集器:

import gc
gc.collect()

答案 3 :(得分:5)

如果您处于Jupyteripython这样的互动环境中,您可能会对清除不需要的var 感兴趣,如果它们变重了。

魔术命令resetreset_selective适用于ipythonJupyter等交互式python会话

1)reset

  

reset如果不带参数调用,则通过删除用户定义的所有名称来重置命名空间。

inout参数指定是否要刷新输入/输出缓存。目录历史记录使用dhist参数刷新。

reset in out

另一个有趣的是array,它只删除了numpy Arrays:

reset array

2)reset_selective

  

通过删除用户定义的名称来重置命名空间。   如果需要,可以留下输入/输出历史记录。

清理阵列示例:

In [1]: import numpy as np
In [2]: littleArray = np.array([1,2,3,4,5])
In [3]: who_ls
Out[3]: ['littleArray', 'np']
In [4]: reset_selective -f littleArray
In [5]: who_ls
Out[5]: ['np']

来源:http://ipython.readthedocs.io/en/stable/interactive/magics.html

答案 4 :(得分:3)

实际上python将回收不再使用的内存。这称为垃圾收集,它是python中的自动进程。但是如果你想这样做,你可以通过del variable_name删除它。您也可以通过将变量分配给None

来实现
a = 10
print a 

del a       
print a      ## throws an error here because it's been deleted already.

从未引用的Python对象中真正回收内存的唯一方法是通过垃圾收集器。 del关键字只是从对象中取消绑定名称,但该对象仍然需要进行垃圾回收。您可以使用gc模块强制垃圾收集器运行,但这几乎肯定是一个过早的优化,但它有自己的风险。使用del没有实际效果,因为这些名称无论如何都会被删除。

答案 5 :(得分:2)

这对我有用。

您需要先对全局变量运行两次,然后对本地变量运行

for name in dir():
    if not name.startswith('_'):
        del globals()[name]

for name in dir():
    if not name.startswith('_'):
        del locals()[name]

答案 6 :(得分:1)

这应该可以解决问题。

globals().clear()