我正在研究一个问题,该问题将计算给定二叉树上的所有分支总和,并将结果返回到数组或python列表中,我知道这是正确的答案,但是在理解聚合过程如何发生时遇到了一些麻烦以及为什么如果要在后续函数调用之前对列表进行更新,那么为什么不是其他变量呢?
代码:
def branchTot(root):
soln = []
fin = help(root, root.value, soln)
return fin
def help(root, sums, soln):
if root.left is None and root.right is None:
soln.append(sums)
else:
if root.right is not None and root.left is not None :
help(root.left, sums + root.left.value, soln)
help(root.right, sums + root.right.value, soln)
elif root.right is not None:
help(root.right, sums + root.right.value, soln)
else:
help(root.left, sums + root.left.value, soln)
return soln
例如与树:
1
/ \
2 3
调用堆栈上的函数将是
(3。)help(3,4,[3])->返回:soln = [3,4]
(2。)help(2,3,[])->返回:soln = [3]
(1。)help(1,1,[])
我的问题是,为什么在last(3。)调用中,如果从上一个(2.)调用中更新了'soln'变量,那么为什么也没有从(2.)而不是root和sum变量中更新仍无法通话(1.)?
像为什么不这样: (因为2.right为None)
(3。)help(None,3 + None,[3])->返回:soln = [3,4]。
(2。)help(2,3,[])->返回:soln = [3]
(1。)help(1,1,[])
答案 0 :(得分:0)
soln
引用的对象 是可变的,可以就地进行(并且已经进行了突变)。其他值是不可变的。 sums + root.left.value
创建一个新对象,以传递给对help
的下一次调用,而在当前对sums
的调用中,root.left.value
和help
都保持不变。>