【问题标题】:Delete a node in a linked list - is any form of garbage collection necessary? [duplicate]删除链表中的节点 - 是否需要任何形式的垃圾收集? [复制]
【发布时间】:2020-05-15 15:40:47
【问题描述】:

[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

【问题讨论】:

  • 是的,Python 有一个垃圾收集器,它最终会发现节点 1 没有被使用,并会释放它的内存。没什么好紧张的……除非你disable the garbage collector
  • 还有thisthisthis

标签: python python-3.x linked-list


【解决方案1】:

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

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

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

    del object

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 2023-03-26
    • 2011-01-18
    • 2012-01-18
    • 1970-01-01
    • 2016-02-29
    • 2012-11-26
    • 1970-01-01
    相关资源
    最近更新 更多