为何出现UnboundLocalError?如何优化嵌套函数代码?
UnboundLocalError错误原因及优化方案
错误原因
在嵌套函数b()里执行t+=1时,Python会默认t是b()的局部变量,但t并没有在b()内部提前定义就直接做自增操作;而外部函数a()中的t属于外层作用域,不通过专门声明的话,内层函数无法直接修改这个外层变量,所以触发了"局部变量在赋值前被引用"的错误。
优化实现方式
方式1:用nonlocal关键字(Python3+推荐)
明确告知Python,t是来自外层嵌套作用域的变量,而非当前函数的局部变量:
def a(): t = 0 def b(): nonlocal t t += 1 return b() print(t) a()
运行后输出1,符合预期。
方式2:借助可变对象间接修改
可变对象(比如列表)的内部元素修改不会触发局部变量判定,外层的列表可以被内层函数直接修改:
def a(): t = [0] def b(): t[0] += 1 return b() print(t[0]) a()
方式3:通过返回值更新变量
让内层函数返回修改后的值,外层函数接收后重新赋值:
def a(): t = 0 def b(val): return val + 1 t = b(t) print(t) a()
内容的提问来源于stack exchange,提问作者code_dominar
相关产品推荐
相关产品推荐

