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

问题描述 投票:0回答:8

我几天来一直在寻找这个问题的准确答案,但没有得到任何好的结果。我不是一个完全的编程初学者,但甚至还没有达到中级水平。

当我在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()

但这一切与我想要实现的目标无关,它不会清除所有使用过的对象。

python memory-management dir
8个回答
233
投票

您可以使用

del
删除个人姓名:

del x

或者您可以将它们从

globals()
对象中删除:

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

这只是一个示例循环;它防御性地仅删除不以下划线开头的名称,(并非无理)假设您仅在解释器中使用开头不带下划线的名称。如果您确实想要彻底,可以使用硬编码的名称列表来保留(白名单)。除了退出并重新启动解释器之外,没有内置功能可以为您进行清除。

您导入的模块 (

import os
) 将保持导入状态,因为它们被
sys.modules
引用;后续导入将重用已导入的模块对象。您只是不会在当前的全局命名空间中引用它们。

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


95
投票

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

%reset

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

%reset -f

这应该有效..


31
投票

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

import gc
gc.collect()

13
投票

这应该可以解决问题。

globals().clear()

12
投票

如果您处于像

Jupyter
ipython
这样的交互式环境中,您可能会对清除不需要的var(如果它们变得很重)感兴趣。

魔法命令

reset
reset_selective
在交互式 Python 会话中可用,例如
ipython
Jupyter

1)

reset

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

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

reset in out

另一个有趣的是

array
,它只删除 numpy 数组:

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


10
投票

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


3
投票

这对我有用。

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

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

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

-1
投票

Python 中可以使用 del 语句删除变量

示例:

y = 10
del y

如果您尝试使用或引用已删除的变量,您将收到错误未定义。

© www.soinside.com 2019 - 2024. All rights reserved.