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

问题描述 投票: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个回答
230
投票

您可以使用

del
删除个人名称:

del x

或者您可以将它们从

globals()
对象中删除:

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

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

您导入的模块 (

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

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


93
投票

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

%reset

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

%reset -f

这应该有效..


31
投票

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

import gc
gc.collect()

12
投票

如果您处于像

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

魔术命令

reset
reset_selective
可用于交互式python会话,如
ipython
Jupyter

1)

reset

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

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

reset in out

另一个有趣的是

array
只删除 numpy 数组:

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


11
投票

这应该可以解决问题。

globals().clear()

10
投票

实际上 python 会回收不再使用的内存。这称为 garbage collection,这是 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
没有实际效果,因为这些名称无论如何都会在超出范围时被删除。


4
投票

这对我有用。

你需要为全局变量运行两次,然后是局部变量

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 删除y

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

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