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

