You need to enable JavaScript to run this app. SumOfLongRootToLeafPath无返回值时maxSum值为何发生变更
优惠活动
大模型
产品
解决方案
定价
更多

SumOfLongRootToLeafPath无返回值时maxSum值为何发生变更

变量修改逻辑解答

首先我们先明确该题Python实现的核心代码结构方便对照:

def SumOfLongRootToLeafPath(root):
    # 注意:最大值和最大长度都用单元素列表存储
    maxSum = [0]
    maxLen = [0]

    def SumOfLongRootToLeafPathUtil(node, currSum, currLen):
        if not node:
            # 路径到叶子节点下的空节点,更新全局最大值
            if currLen > maxLen[0]:
                maxLen[0] = currLen
                maxSum[0] = currSum
            elif currLen == maxLen[0]:
                maxSum[0] = max(maxSum[0], currSum)
            return
        # 递归左右子树
        SumOfLongRootToLeafPathUtil(node.left, currSum + node.data, currLen + 1)
        SumOfLongRootToLeafPathUtil(node.right, currSum + node.data, currLen + 1)
    
    SumOfLongRootToLeafPathUtil(root, 0, 0)
    return maxSum[0]

你观察到的不需要返回值就能修改maxSum的现象,本质是Python的变量作用域和可变对象特性共同作用的结果:

  • 代码里没有把maxSum定义为普通整数,而是定义为单元素列表。列表属于Python的可变对象,存储的是指向内部元素的引用。
  • 嵌套的工具函数SumOfLongRootToLeafPathUtil中,修改的是maxSum[0],也就是列表的内部元素,不是重新给maxSum这个变量名赋值。这种对可变对象内部属性的修改,不需要额外声明就可以直接操作外层函数的同一个列表对象。
  • 整个递归过程中所有工具函数的调用,操作的都是同一个maxSum列表,所以不需要通过返回值传递,外层的maxSum的内容自然会被更新。

补充说明:如果把maxSum换成普通整数变量,直接在工具函数里赋值会被Python识别为函数内部的局部变量,不会修改外层的同名变量。如果要用整数实现,需要在工具函数开头加nonlocal maxSum声明,告知Python该变量来自外层作用域。

内容的提问来源于stack exchange,提问作者THE_GO_ODFATHER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 13:15:07