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

Python嵌套函数声明全局变量仍报NameError,原因是什么?

问题分析与解决方案

错误原因

  • 你在bToDLL函数内部定义的h和p是函数局部变量,不属于全局作用域。
  • 嵌套函数sol里用global h,p声明,会让Python去全局环境查找这两个变量,但全局环境根本没定义它们,所以触发NameError。

修正方案

把global换成nonlocal——这个关键字的作用是告诉Python:去当前函数的外层嵌套函数作用域找目标变量,正好匹配你的场景。同时还要修正bToDLL的参数错误(多写了一个逗号)。

修正后的代码:

def bToDLL(root):
    # do Code here
    h, p = None, None
    def sol(r):
        nonlocal h, p
        if r is None:
            return
        
        sol(r.left)
        
        if p is None:
            h = r
        else:
            r.left = p
            p.right = r
        
        p = r
        
        sol(r.right)
    
    sol(root)  
    return h

额外说明

  • 用is None代替== None是Python的惯用写法,判断更严谨。
  • nonlocal是Python 3引入的语法,专门用于嵌套函数中引用并修改外层非全局的变量,完美适配你这种内层函数需要操作外层函数局部变量的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:31:16