我正在创建一个简单的树,其中每个节点在 Python 中都有任意数量的子节点,并且我创建了一个 Node 类来帮助我。每个节点都包含对其父节点 (int) 和任何子节点 (list) 的引用。
但是,向 Node 构造函数的参数显式添加一个空列表给了我奇怪的结果,我想解释一下为什么当列表显式或未显式放入构造函数参数时此行为会发生变化:
实施#1:
class Node:
def __init__(self, value, parent, children=[]):
self.parent = parent
self.value = value
self.children = children
实施#2:
class Node:
def __init__(self, value, parent):
self.parent = parent
self.value = value
self.children = []
要填充“节点”数组:
parents = [4,-1,4,1,1]
nodes = [None] * n
for i in range(n):
nodes[i] = Node(i, parents[i])
存储每个节点的父属性:
tree = Tree()
for i, node in enumerate(nodes):
parent_id = node.parent
if parent_id == -1:
tree.root = nodes[i]
else:
nodes[parent_id].children.append(node.value)
print([(node.value, node.children) for node in nodes])
通过实施#1,我得到:
[(0, [0, 2, 3, 4]), (1, [0, 2, 3, 4]), (2, [0, 2, 3, 4]), (3, [0, 2, 3, 4]), (4, [0, 2, 3, 4])]
但是通过实施#2,我(正确地)得到:
[(0, []), (1, [3, 4]), (2, []), (3, []), (4, [0, 2])]
为什么有区别?我不明白为什么即使使用if
andelse
语句,每个节点的列表也是完全填充的。感谢所有帮助,包括如果您认为有更好的方法可以做到这一点。