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

这几天我一直在寻找这个问题的准确答案,但是一无所获。我在编程方面不是一个完全的初学者,但是甚至还没有达到中级水平。

在 Python 的 shell 中,我输入: dir(),就可以看到当前作用域(main block)中所有对象的名称,其中有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()

但是所有这些都与我想要达到的目标无关,它不会清除所有用过的对象。

413543 次浏览

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

del x

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

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

这只是一个示例循环; 它只删除不以下划线开头的名称,从而(不无道理地)假设在解释器中只在开头使用了不带下划线的名称。如果您真的想要彻底,您可以使用一个硬编码的名称列表来代替(白名单)。除了退出并重新启动解释器之外,没有其他内置函数来为您执行清除操作。

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

然而,Python 并不对内存中的数据进行任何安全保证。当不再引用对象时,解释器将内存标记为不再使用,但不采取措施覆盖该内存以防止访问数据。如果需要这种级别的安全保护,则需要使用第三方扩展来管理自己的内存,同时考虑到安全性。

实际上,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没有实际效果,因为这些名称无论如何都会在超出作用域时被删除。

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

%reset

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

%reset -f

这个应该可以。

如果你在一个交互式的环境,如 Jupyteripython,你可能会感兴趣的 清除不需要的变种人,如果他们变得沉重。

魔法命令 resetreset_selective可用于交互式 Python 会话,如 ipythonJupyter

1) reset

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

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

reset in out

另一个有趣的例子是 array,它只移除了麻木的数组:

reset array

2)复位选择性

通过移除用户定义的名称来重置命名空间。 如果您需要输入/输出历史记录,它们会被保留下来。

干净的数组示例:

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

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

import gc
gc.collect()

这招对我很管用。

对于全局变量和局部变量,需要运行两次

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


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

这个应该能行。

globals().clear()