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

2025-04-16 08:57:00
admin
原创
13
摘要:问题描述:我已经搜索这个问题的准确答案好几天了,但一直没找到合适的答案。我虽然算不上完全的编程初学者,但甚至还没到中级水平。当我在 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

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

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

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用