有没有办法从解释器的内存中删除创建的变量、函数等?
- 2025-04-16 08:57:00
- admin 原创
- 13
问题描述:
我已经搜索这个问题的准确答案好几天了,但一直没找到合适的答案。我虽然算不上完全的编程初学者,但甚至还没到中级水平。
当我在 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()
但这一切与我想要实现的目标无关,它并没有清除所有使用过的物品。
解决方案 1:
您可以使用以下命令删除单个姓名del
:
del x
或者你可以从globals()
对象中删除它们:
for name in dir():
if not name.startswith('_'):
del globals()[name]
这只是一个示例循环;它防御性地只删除不以下划线开头的名称,并假设您在解释器中只使用开头不带下划线的名称(这并非毫无道理)。如果您真的想彻底清除,可以使用硬编码的名称列表(白名单)来保留。除了退出并重新启动解释器之外,没有内置函数可以为您执行清除操作。
您已导入的模块 ( import os
) 将保持导入状态,因为它们被 引用sys.modules
;后续导入将重用已导入的模块对象。您只是在当前的全局命名空间中失去了对它们的引用。
然而,Python 并不对内存中的数据提供任何安全保证。当对象不再被引用时,解释器会将内存标记为不再使用,但不会采取措施覆盖该内存以阻止对数据的访问。如果您需要这种级别的安全保护,则需要使用第三方扩展程序,这些扩展程序会以安全为核心管理自身的内存。
解决方案 2:
是的。有一种简单的方法可以删除 iPython 中的所有内容。在 iPython 控制台中,只需输入:
%reset
然后系统会要求您确认。按 y。如果您不想看到此提示,只需输入:
%reset -f
这应该可行。
解决方案 3:
您可以使用python垃圾收集器:
import gc
gc.collect()
解决方案 4:
这应该可以解决问题。
globals().clear()
解决方案 5:
如果您处于类似的交互式环境中,Jupyter
或者如果不需要的变量变得越来越重,ipython
您可能会有兴趣 清除它们。
魔法命令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
解决方案 6:
实际上,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 模块强制运行垃圾收集器,但这几乎肯定是一种过早的优化,而且它本身也有风险。使用 deldel
不会产生任何实际效果,因为这些名称无论如何都会在超出作用域时被删除。
解决方案 7:
这对我有用。
您需要运行两次,一次针对全局变量,然后针对本地变量
for name in dir():
if not name.startswith('_'):
del globals()[name]
for name in dir():
if not name.startswith('_'):
del locals()[name]
解决方案 8:
您可以使用 del 语句在 Python 中删除变量
例子:
y = 10
del y
如果您尝试使用或引用已删除的变量,您将收到未定义的错误。
扫码咨询,免费领取项目管理大礼包!