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

Python类中嵌套函数为何可访问外层列表却无法访问普通变量?

为什么将res改为普通变量后,嵌套dfs函数无法正常访问修改?

这本质是Python的变量作用域规则和可变对象特性共同导致的:

  • 当你把res = [0]改成普通变量res = 0后,在dfs函数里执行res = max(res, 2 + left + right)时,Python会把这个res判定为局部变量——因为你对它做了赋值操作。但这个局部变量在赋值前没有被定义,运行时就会抛出UnboundLocalError。

  • 而用列表res = [0]时,你并没有对res变量本身重新赋值,只是修改了它指向的列表对象的第0个元素(res[0] = ...)。这种情况下,Python会自动在外层函数作用域查找res变量,找到后直接操作它指向的可变对象,不需要额外声明。

如果非要用普通变量实现,只需要在dfs函数开头加上nonlocal res声明,明确告诉Python这个变量来自外层函数的作用域,代码示例如下:

class Solution:
    def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:
        
        res = 0
        
        def dfs(root):
            nonlocal res  # 声明res来自外层函数作用域
            if not root:
                return -1
            left = dfs(root.left)
            right = dfs(root.right)
            res = max(res, 2 + left + right)
            return 1 + max(left, right)
        dfs(root)
        return res

核心总结

  • 普通变量的赋值操作会触发Python的局部变量判定逻辑,未用nonlocal声明时会报错
  • 列表属于可变对象,修改其内部元素不会改变变量本身的指向,因此可以直接访问外层作用域的变量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:39:22