嵌套函数中的UnboundLocalError问题咨询及原理求证
Python nonlocal关键字实验问题解答
实验代码:
def a(): b = 5 print(f"b (1) = {b}") def c(): #nonlocal b print(f"b (2) = {b}") b = 3 c() a()
注释掉nonlocal后出现的错误:
Traceback (most recent call last): File "<string>", line 10, in <module> File "<string>", line 8, in a File "<string>", line 6, in c UnboundLocalError: cannot access local variable 'b' where it is not associated with a value
你的理解完全正确。
Python解析函数时会先扫描整个函数体,只要函数内部存在变量赋值语句(比如示例里的b = 3),就会把这个变量标记为当前函数的局部变量,不再去外层作用域查找。所以在c()函数执行print(f"b (2) = {b}")时,Python认定b是c的局部变量,但此时它还没被赋值,就会抛出UnboundLocalError。
你可以查看Python官方文档中关于变量作用域的章节,里面详细说明了LEGB(局部、闭包嵌套、全局、内置)的作用域查找规则,以及nonlocal、global关键字的具体用法。
内容的提问来源于stack exchange,提问作者Michael Schäfer
相关产品推荐
相关产品推荐

