几天来我一直在寻找这个问题的准确答案,但没有得到任何好的答案。我不是编程的完全初学者,但甚至还没有达到中级水平。
当我在 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()
如果您处于像
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
这应该可以解决问题。
globals().clear()
实际上 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
没有实际效果,因为这些名称无论如何都会在超出范围时被删除。
这对我有用。
你需要为全局变量运行两次,然后是局部变量
for name in dir():
if not name.startswith('_'):
del globals()[name]
for name in dir():
if not name.startswith('_'):
del locals()[name]