You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归与变量作用域交互原理——LeetCode问题异常解析

问题原因解析

这本质是Python的作用域解析规则导致的,核心区别在于变量赋值操作和可变对象元素修改操作的本质不同:

1. 不可变对象(比如整数0)的情况

当你把max_diff定义为整数0,在内部递归函数里写类似max_diff = max(max_diff, abs(node.val - ancestor_val))的时候,这是在给max_diff变量本身赋值。Python在编译内部函数时,只要发现有对变量的赋值操作,就会自动把这个变量标记为当前函数的局部变量——哪怕外层作用域已经有同名变量。

这就导致执行时,你在赋值前就引用了max_diff(右边的max_diff),但此时局部的max_diff还没被初始化,直接触发UnboundLocalError。

2. 可变对象(比如列表[0])的情况

当你用列表max_diff = [0]时,代码里做的是max_diff[0] = max(max_diff[0], ...)——这不是给max_diff变量本身赋值,而是修改列表对象内部的元素。Python不会把max_diff标记为局部变量,而是会按照LEGB规则(局部→嵌套→全局→内置)去外层作用域查找这个变量,找到后直接修改它指向的列表对象的内容,所以不会报错。

解决整数变量的报错方法

如果想继续用整数类型的max_diff,只需要在内部函数开头用nonlocal关键字声明,告诉Python这个变量不是当前函数的局部变量,而是来自外层嵌套作用域:

def maxAncestorDiff(root):
    max_diff = 0
    def dfs(node, ancestors):
        nonlocal max_diff
        # 后续逻辑中直接赋值max_diff即可
        for val in ancestors:
            current_diff = abs(node.val - val)
            if current_diff > max_diff:
                max_diff = current_diff
        # ... 其他递归逻辑
    dfs(root, [root.val])
    return max_diff

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:40:22