Python中nonlocal关键字在二叉搜索树验证代码中报错的原因
问题原因分析
你的第一段代码出现nonlocal语法错误的核心原因是在嵌套函数的局部代码块内重复声明了nonlocal变量,违反了Python的语法规则:
具体错误点
在find函数中,你已经在函数开头声明了nonlocal bst,但之后又在if条件块内再次使用nonlocal bst声明:
def find(cur): nonlocal bst # 第一次声明,符合规则 ... if l>cur.val: nonlocal bst # 错误:在局部代码块内重复声明nonlocal bst=0 return if r<cur.val: nonlocal bst # 同样错误:重复声明 bst=0 print(bst) return
Python规定,nonlocal声明必须放在嵌套函数作用域的最顶部,不能在if、for等局部代码块内再次声明同一变量。
对比第二段代码的正确写法
第二段代码中,nonlocal d仅在嵌套函数fun的开头声明了一次,没有在代码块内重复声明,完全符合语法规则,因此可以正常运行:
def gen(): d=56 def fun(): nonlocal d # 仅在函数开头声明一次 d=70 return fun() print(d)
额外提示
你的验证二叉搜索树代码还有其他逻辑问题(比如当节点左子树为空时,max(left(cur.left,[]))会因空列表报错),但当前的语法错误仅来自重复的nonlocal声明,去掉条件块内的nonlocal bst语句即可解决这个语法问题。
内容的提问来源于stack exchange,提问作者Anusha Yerram
相关产品推荐
相关产品推荐

