递归聚合return 语句问题

Recursive aggregation return statements question

我正在研究一个问题,该问题计算给定二叉树上的所有分支总和以及 returns 数组或 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.) 帮助(3,4,[3]) --> 返回:soln = [3,4]

(2.) help(2,3,[]) --> 返回:soln = [3]

(1.) 帮助(1,1,[])

我的问题是为什么在最后一个 (3.) 调用中如果 'soln' 变量是从上一个 (2.) 调用更新的那么为什么根和总和变量也不是从 (2 .) 而不是仍然来自 call(1.)?

比如为什么不是: (因为 2.right 是 None)

(3.) 帮助(None,3+None,[3]) --> 返回:soln = [3,4]。

(2.) help(2,3,[]) --> 返回:soln = [3]

(1.) 帮助(1,1,[])

soln 引用的对象是可变的,可以(并且已经)就地改变。其他值是不可变的; sums + root.left.value 创建一个新对象以传递给下一次调用 help,而 sumsroot.left.value 在当前调用 help 时保持不变。