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
相关产品推荐
相关产品推荐

