python - 删除链表中的节点 - 是否需要任何形式的垃圾收集?
问题描述
[Python 3.8]
删除链表中的next
节点时,可以简单地更改节点吗?
在这里,我们“删除”节点 1,只需更改指针即可。
来自 C++ 世界,这让我有点紧张。节点 1 的内存是否会自动回收,因为没有对其的引用?节点 1 到底发生了什么?
前
[Sentinel] -> [Node 0] -> [Node 1] -> [Node 2] -> [Node 3] -> None
后
[Sentinel] -> [Node 0] -┐ [Node 1] -┬-> [Node 2] -> [Node 3] -> None
└-----------┘
这是合法的吗?
最小的、完整的、可验证的例子
def delete(self, val):
n = self.sentinel
while n.next != None:
if n.next.data == val:
n.next = n.next.next # reassign pointer - no del, free, delete, or the like.
return
n = n.next
解决方案
在 CPython 中,垃圾收集的主要形式是通过引用计数。当对象的引用计数降至 0 时,该对象会立即自动回收。
Python 的其他实现通常不使用引用计数,但垃圾仍然会自动回收——最终。然后,您只会丢失“立即”部分。
这是一件好事,因为无论你看起来多么努力,在 Python 中你永远找不到任何可以让你强制释放内存的东西。特别是,该del
声明
del object
不会“删除”对象。它只是删除了 name 的当前绑定,将绑定到的对象的object
引用数量减少了1。这可能会使该对象成为垃圾,也可能不会。object
推荐阅读
- racket - 简单递归函数 - 获取一个字符串并返回 n 次
- python - 在 Flask App 中使用 Tensorflow 嵌入投影仪(将投影仪托管在网页上)
- discord.js - Discord.js-commando 我将如何检查提到的用户是否具有角色,例如静音角色?
- r - 计算 r 中的 7 天平均值
- neo4j - 如何在 Neo4J 中查询多个项目,按优先顺序只返回一个?
- r - github 操作找不到我的 R 包的文件
- javascript - 使用 RegEx 替换自定义组件
- oauth - ETrade api - 无效的消费者密钥和/或会话令牌
- angular - 如何只订阅一次可观察的
- java - Selenium 图像处理/去除水印