python会自动垃圾收集双链表吗? [复制]

2023-11-22

背景

我有一个树结构。在这个树结构中,我将节点的子节点维护为双向链表:

enter image description here
(source: Doubly linked list)

(我选择这种结构是因为创建此列表的广度优先搜索方法。)

Problem

现在我关心的是垃圾收集器是否可以自动销毁这个列表。当然,我只保留对这三个节点的根节点的引用。 GC 的原理是,它收集内存中的数据结构,但不指向任何引用。但在双向链表中,每个节点都从其兄弟节点引用,而兄弟节点又引用该节点。因此总会有对节点的引用,而 GC 永远不会收集它。

垃圾收集器会处理双向链表吗?

如果没有,最简单的收集方法是什么?

相关问题:

为什么 Lua 使用垃圾收集器而不是引用计数?
Python:修改列表时的内存使用和优化


每个 Python 实现都有不同的垃圾收集方案。通用的答案是“是的,如果它是垃圾,就应该被垃圾收集。”但您可能想要比这更具体的东西。


在 CPython 中,垃圾收集使用引用计数以及循环收集器。如果一个对象的引用计数下降到 0,它就会被清理。但就您而言,当列表的所有外部引用都消失时,仍然会有内部引用,因此重新计数本身无法解决您的问题。这就是循环收集器的用途。

假设你的节点没有__del__方法,并且您没有(直接或间接)禁用“补充垃圾收集”(默认情况下处于启用状态),循环收集器将检测到您的节点都互相引用,但没有其他节点引用它们,并将其清理。 (这可能需要两次传递,因为它使用代系统。)

您可以使用gc显式运行循环收集器的模块(gc.collect())而不是等待它,或者检查它正在做什么。例如,如果您这样做:

gc.collect()
oldcounts = gc.get_counts()
del last_reference_to_list
gc.collect()
newcounts = gc.get_counts()
print(oldcounts, newcounts)

…您应该能够判断(虽然不是完全可靠,但足以用于学习和测试目的)您的节点全部消失了。


如果你的节点怎么办do have __del__方法?那么你就必须给GC一些帮助。你需要做的是打破任何包含对象的循环__del__方法。如果列表之间没有任何节点共享,最明显的方法就是遍历列表并del向前和向后指针。 (从技术上讲,你只需要del两者之一,但您也可以两者都做。)如果您需要__del__节点上的方法,您可能需要顶层的方法dl_list (or tree_node或者任何拥有这些的东西),所以这是一个明显的放置它的地方。

当然如果你不需要__del__方法,还有一个更简单的解决方案:摆脱它。


最后一种可能性是使用weakref用于反向链接,但常规引用用于正向链接。这样,就不存在可能的循环。但是您在添加和删除节点时必须小心一些,以确保您不会暂时留下一个除了弱引用之外什么都没有的节点。


如果您使用 Jython 或 IronPython,则垃圾收集与底层运行时(JVM 或 .NET)相关联,因此您必须阅读相应的文档。

PyPy 有自己的垃圾收集器(实际上是不同选项的选择),您可以阅读here.

如果您使用的是不太常见的实现,应该有类似的文档可用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python会自动垃圾收集双链表吗? [复制] 的相关文章

  • Huggingface 变形金刚模块未被 anaconda 识别

    我正在使用 Anaconda python 3 7 Windows 10 我尝试通过安装变压器https huggingface co transformers https huggingface co transformers 在我的环境
  • TCP打孔问题

    我尝试使用 Python 3 中概述的原则为防火墙编写一个基本的 TCP 打孔器本文 http www bford info pub net p2pnat index html 不过 我无法连接任何东西 这是代码 usr bin pytho
  • Python实时读取串口数据

    我正在使用 Python 中的脚本通过串行端口以 2Mbps 的速度从 PIC 微控制器收集数据 PIC 在 2Mbps 下完美定时工作 FTDI USB 串行端口在 2Mbps 下工作也很好 均通过示波器验证 我每秒发送消息 大小约为 1
  • python中嵌套字典值的总和

    我有一本这样的字典 data 11L a 2 b 1 a 2 b 3 22L a 3 b 2 a 2 b 5 a 4 b 2 a 1 b 5 a 1 b 0 33L a 1 b 2 a 3 b 5 a 5 b 2 a 1 b 3 a 1 b
  • Python,将字典存储在数据库中

    在数据库中存储和检索 python 字典的最佳方法是什么 如果您对使用传统 SQL 数据库 例如 MySQL 不是特别感兴趣 您可以研究非结构化文档数据库 其中文档自然映射到 python 字典 例如MongoDB http www mon
  • 使用 Matplotlib 的范围绘制图像的 3D 轮廓

    正如我所介绍的here https stackoverflow com questions 18792624 fits image input to a range in plot python 在二维中 我想知道如何 缩放 要绘制到绘图中
  • 使用 NumPy 的 Mittag-Leffler 函数的不稳定性

    在尝试重现时Wolfram MathWorld 上的情节 http mathworld wolfram com Mittag LefflerFunction html 并试图帮助这个问题 https stackoverflow com qu
  • 如何使用appium自动化Android手机后退按钮

    我正在使用 Appium python 客户端库 对 Android 上的混合移动应用程序进行测试自动化 我无法找到任何方法来自动化或创建手势以使用 电话后退 按钮返回到应用程序的上一页 有没有可以使用的驱动函数 我尝试了 self dri
  • 使用 argparse 指定默认文件名,但不使用 --help 打开它们?

    假设我有一个对文件执行一些操作的脚本 它在命令行上获取此文件的名称 但如果未提供 则默认为已知文件名 content txt 说 与蟒蛇的argparse 我使用以下内容 parser argparse ArgumentParser des
  • 是否可以在 Jupyter 笔记本中显示控制台?

    我希望能够使用 Jupyter 笔记本中的控制台在环境中进行摆弄 添加额外的单元格意味着我总是必须滚动到最底部或在我想要 类似控制台 文本字段的任何地方创建新单元格 是否可以有一个永久的控制台窗口 例如在窗口底部 Thanks 您可以启动连
  • 如何使直方图列的宽度都相同

    我在操作直方图时遇到了一些麻烦 我有一个包含两列的 df 我将它们绘制为堆叠直方图 我将它们放入特定的垃圾箱中 请参阅下面的代码 但我想在最后制作一个大垃圾箱 4000 10000 但是 默认情况下 大垃圾箱的列宽很大 有没有办法让这个大垃
  • 如何打印和显示子进程 stdout 和 stderr 输出而不失真?

    也许有人可以帮助我解决这个问题 我在 SO 上看到了许多与此类似的问题 但没有一个问题同时处理标准输出和标准错误 也没有处理像我这样的情况 因此出现了这个新问题 我有一个 python 函数 它打开一个子进程 等待它完成 然后输出返回代码以
  • 导入我自己的模块时出现“ImportError:没有名为...的模块”

    我正在尝试导入模块 但不断收到导入错误 在 PortfolioStatus py 文件中 我有以下代码 它从 share data py 模块导入 share data 类 from Shares share data import sha
  • 保存游戏最高分?

    我使用 pygame 在 python 中制作了一个非常简单的游戏 分数取决于玩家达到的级别 我将级别作为变量称为score 我想在游戏开始或结束时显示顶级 我会更乐意显示多个分数 但我见过的所有其他线程都太复杂 我无法理解 所以请保持简单
  • 尝试将 cuda 与 pytorch 一起使用时出现运行时错误 999

    我为我的 Geforce 2080 ti 安装了 Cuda 10 1 和最新的 Nvidia 驱动程序 我尝试运行一个基本脚本来测试 pytorch 是否正常工作 但出现以下错误 RuntimeError cuda runtime erro
  • Python itertools groupby 中令人不安的奇怪行为/错误?

    我在用itertools groupby解析一个短的制表符分隔的文本文件 文本文件有几列 我想做的就是对具有特定值的所有条目进行分组x在特定的列中 下面的代码对名为的列执行此操作name2 寻找变量中的值x 我尝试使用以下方法来做到这一点c
  • Python 对列表中的值求和(如果它存在于另一个列表中)

    我有一个列表和一组 a list 1 2 2 1 1 1 b list 1 2 我正在寻找对应 b list 中的项目并将它们从 a list 中的值相加 以便输出为 1 3 2 1 我尝试过的 sum 0 for i in a list
  • 设置字符串中单词或字符数的限制

    假设我有一个字符串元素列表 wordlist hi what s up home diddle mc doo Oh wise master kakarot hello have a da 我希望列表中的每个元素最多包含 3 个单词或 20
  • Python Pandas:向类 pandas.core.series.Series 添加方法

    我想在 Python 中处理时间序列 因此 Pandas 的 Series 类非常完美 并且有很多有用的方法 现在我想添加一些我需要但未实现的方法 例如 假设我有兴趣添加一个方法 该方法将两次一值附加到时间序列中 让我们调用该方法appen
  • 重新安装后使用 pandas dataframes 时出现问题

    我已经重新安装了 Python 和 Anaconda 现在面临以下问题 在我将 pkl 文件加载到数据帧并尝试 查看 该文件后 如下所示 df pd read pickle example pkl df 我收到错误 AttributeErr

随机推荐