为何Python函数本地更新全局变量时触发UnboundLocalError报错?
问题:为什么第三个Python函数会抛出UnboundLocalError?
先看第一个测试程序:
def test(): y = x y = y + 1 return y x = 5 print(test()) print(x)
输出结果:
6 5
这符合预期:函数内没有定义x,Python会自动去全局作用域查找x的值,用来给局部变量y赋值。
再看第二个测试程序:
def test(): x = 6 return x x = 5 print(test()) print(x)
输出结果同样是:
6 5
这也符合预期:函数内直接定义了局部变量x,它会遮蔽全局的x,函数调用结束后局部x被销毁,全局x不受影响。
但运行第三个程序时,却出现了意外错误:
def test(): x = x + 1 return x x = 5 print(test()) print(x)
错误信息:
Traceback (most recent call last): File "<main.py>", line 6, in <module> File "<main.py>", line 2, in test UnboundLocalError: cannot access local variable 'x' where it is not associated with a value
核心原因:Python的作用域判定规则
Python在编译函数代码阶段,会扫描整个函数体的代码:
- 如果发现函数内存在对某个变量的赋值操作(比如第三个函数里的
x = x + 1),就会把这个变量标记为局部变量,不管赋值语句的位置在代码前还是后。 - 当函数运行到
x = x + 1时,Python会优先尝试读取局部变量x,但此时局部x还没有被赋值(赋值操作还没完成),所以就抛出了UnboundLocalError。
对比前两个程序:
- 第一个函数里没有对
x的赋值操作,Python会默认去全局作用域找x,所以能正常读取全局变量的值。 - 第二个函数里直接给局部
x赋值后再返回,局部变量已经被初始化,所以没问题。
如何修复第三个程序
如果想要在函数内修改全局变量x,需要用global关键字明确声明x是全局变量:
def test(): global x x = x + 1 return x x = 5 print(test()) print(x)
此时运行会输出:
6 6
global关键字告诉Python:这个x是全局作用域的变量,不要把它当成局部变量处理。
内容的提问来源于stack exchange,提问作者Julian Newman
相关产品推荐
相关产品推荐

