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

2025-04-16 08:57:00
admin
原创
48
摘要:问题描述:我已经搜索这个问题的准确答案好几天了,但一直没找到合适的答案。我虽然算不上完全的编程初学者,但甚至还没到中级水平。当我在 Python 的 shell 中输入:dir()我可以看到当前范围(主块)中所有对象的所有名称,共有 6 个:['__builtins__', '__doc__', '__loa...

问题描述:

我已经搜索这个问题的准确答案好几天了,但一直没找到合适的答案。我虽然算不上完全的编程初学者,但甚至还没到中级水平。

当我在 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您可能会有兴趣 清除它们。

魔法命令resetreset_selective可用于交互式 Python 会话,例如 ipythonJupyter

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

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3949  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2735  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   74  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   82  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   68  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用