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

LeetCode二叉树直径问题:全局int变量访问报错,list却正常?

为什么int变量报错而List可以正常运行

这是Python变量作用域规则导致的差异:

  • 对于第一段代码里的int类型变量dia:
    在嵌套的dfs函数中,当你执行dia = max(dia, 2+left+right)时,Python会将dia标记为当前函数的局部变量。但在这之前的print(dia)语句已经尝试引用这个局部变量,而此时它还没有被赋值,所以就抛出了UnboundLocalError——本质是局部变量在赋值前被引用了。

  • 对于第二段代码里的list类型变量dia:
    你执行的是dia[0] = max(dia[0], 2+left+right),这并不是给dia本身赋值,而是修改列表对象的元素。Python会向上查找外层作用域的dia变量(也就是那个列表对象),不会将dia标记为dfs的局部变量,因此可以正常访问和修改列表里的元素,不会触发作用域错误。

修复第一段代码的两种方法

  1. 使用nonlocal关键字声明,明确告诉Pythondia是外层函数的变量:
class Solution(object):
    def diameterOfBinaryTree(self, root):
        dia=0
        def dfs(root): 
            nonlocal dia  # 声明dia来自外层作用域
            if not root:
                return -1
            left=dfs(root.left)
            right=dfs(root.right)
            dia=max(dia,2+left+right)
            return 1+ max(left, right)
        
        dfs(root)
        return dia
  1. 继续使用可变对象(比如list、字典),通过修改对象内部值绕过赋值带来的作用域问题,也就是你第二段代码的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:01:51