删除链表中的节点 - 是否需要任何形式的垃圾收集?

kmi*_*las 3 python linked-list python-3.x

[Python 3.8]

删除链表中的next节点时,是否可以简单地更改节点?

在这里,我们“删除”节点 1,只需更改指针即可。

来自 C++ 世界,这让我有点紧张。由于没有对节点 1 的引用,节点 1 的内存会自动回收吗?节点 1 到底发生了什么?

[Sentinel] -> [Node 0] -> [Node 1] -> [Node 2] -> [Node 3] -> None
Run Code Online (Sandbox Code Playgroud)

[Sentinel] -> [Node 0] -? [Node 1] -?-> [Node 2] -> [Node 3] -> None
                        ?-----------?
Run Code Online (Sandbox Code Playgroud)

这是合法的吗?

最小的、完整的、可验证的例子

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
Run Code Online (Sandbox Code Playgroud)

Tim*_*ers 6

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

Python 的其他实现通常不使用引用计数,但最终仍会自动回收垃圾。那么你只会失去“立即”的部分。

这是一件好事,因为无论你怎么看,你都不会在 Python 中找到任何可以强制释放内存的东西。特别是,del声明

    del object
Run Code Online (Sandbox Code Playgroud)

没有“删除”的对象。它只是删除当前名称的结合object,减少对对象的引用数object 1。这可能会或可能不会让该对象的垃圾势必。