首页 > 解决方案 > 删除链表中的节点 - 是否需要任何形式的垃圾收集?

问题描述

[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

标签: pythonpython-3.xlinked-list

解决方案


在 CPython 中,垃圾收集的主要形式是通过引用计数。当对象的引用计数降至 0 时,该对象会立即自动回收。

Python 的其他实现通常不使用引用计数,但垃圾仍然会自动回收——最终。然后,您只会丢失“立即”部分。

这是一件好事,因为无论你看起来多么努力,在 Python 中你永远找不到任何可以让你强制释放内存的东西。特别是,该del声明

    del object

不会“删除”对象。它只是删除了 name 的当前绑定,将绑定到的对象object引用数量减少了1。这可能会使该对象成为垃圾,也可能不会。object


推荐阅读