我(仍在)处理Python程序中的树结构。 树中的每个节点都有一个字典“children”,其键包含弧形信息和值 是子节点。 (并且每个节点都有一个(parent,parent_arc)对,其中parent是其父节点,parent_arc是父节点链接此节点的弧。)
现在我想修剪一个子树,它的根是节点N的子节点。说孩子是N.children [a]。
del N.children [a]根本不会释放子树占用的内存。我是否必须实现删除子树中每个节点的方法?我怎样才能做到这一点 ?我是否需要重新定义节点类以进行有效的子树修剪?
谢谢!
答案 0 :(得分:2)
当A - >; B和B - >你有参考周期。解决这个问题的一个好方法是让孩子们使用弱引用指向父母。像这样:
import weakref
class Node():
parent = None
child = None
@property
def parent(self):
parent = self._parent()
if parent is not None:
return parent
raise ValueError("parent has been deleted")
@parent.setter # python 2.6+
def parent(self, parent):
self._parent = weakref.ref(parent)
现在,该节点没有与其父节点的直接链接,当您删除该节点时,它确实会消失*。 (您可能需要对parent_arc使用相同的方法。)
*请注意,即使Python在没有引用周期的情况下会更快地释放对象,也可能无法将该内存返回给操作系统。