我几天来一直在寻找这个问题的准确答案,但没有得到任何好的结果。我不是一个完全的编程初学者,但甚至还没有达到中级水平。
当我在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()
但这一切与我想要实现的目标无关,它不会清除所有使用过的对象。
您可以使用
del
删除个人姓名:
del x
或者您可以将它们从
globals()
对象中删除:
for name in dir():
if not name.startswith('_'):
del globals()[name]
这只是一个示例循环;它防御性地仅删除不以下划线开头的名称,(并非无理)假设您仅在解释器中使用开头不带下划线的名称。如果您确实想要彻底,可以使用硬编码的名称列表来保留(白名单)。除了退出并重新启动解释器之外,没有内置功能可以为您进行清除。
您导入的模块 (
import os
) 将保持导入状态,因为它们被 sys.modules
引用;后续导入将重用已导入的模块对象。您只是不会在当前的全局命名空间中引用它们。
Python 不对内存中的数据提供任何安全保证。当对象不再被引用时,解释器将内存标记为不再使用,但不会采取措施覆盖该内存以防止访问数据。如果您需要这种级别的安全保护,则需要使用第三方扩展来管理自己的内存并考虑到安全性。
是的。有一个简单的方法可以删除 iPython 中的所有内容。 在 iPython 控制台中,只需输入:
%reset
然后系统会要求您确认。按 y。 如果您不想看到此提示,只需输入:
%reset -f
这应该有效..
您可以使用Python垃圾收集器:
import gc
gc.collect()
这应该可以解决问题。
globals().clear()
如果您处于像
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
实际上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
没有实际效果,因为这些名称无论如何都会在超出范围时被删除。
这对我有用。
您需要为全局变量运行两次,然后是本地变量
for name in dir():
if not name.startswith('_'):
del globals()[name]
for name in dir():
if not name.startswith('_'):
del locals()[name]