为何添加if语句后代码触发UnboundLocalError错误?
为什么添加if语句后Python函数无法识别全局变量?
我无法理解这段代码为何无法运行,我确定之前写过结构完全相同的代码却未出现该错误。该问题在Python 3.9和3.10版本中均存在,我已在虚拟环境、全局环境及Jupyter Notebook中测试过。
以下代码可正常运行:
# this works as expected my_var = 'xxx' def my_func(): print(my_var) if __name__ == '__main__': my_func()
以下代码无法运行:
# this does not work my_var = 'xxx' def my_func(): print(my_var) if my_var == 'xxx': my_var = 'yyy' if __name__ == '__main__': my_func()
为何添加if语句会导致代码报错?添加后函数完全无法识别变量,甚至在执行if语句前的print时就失败了。
问题原因
这是Python的作用域绑定规则导致的:当函数内部出现对变量的赋值操作(哪怕是在if分支里,哪怕这个分支实际不会执行),Python会在函数编译阶段就把这个变量标记为局部变量。
在第二个代码里,my_func里有my_var = 'yyy'这行赋值,所以Python认定my_var是局部变量。当函数执行到print(my_var)时,局部的my_var还没被赋值(赋值在if分支里,哪怕条件为真也是在print之后),就会抛出UnboundLocalError: local variable 'my_var' referenced before assignment。
而第一个代码里,函数只是读取my_var,没有赋值操作,所以Python会去全局作用域查找这个变量,因此能正常运行。
解决方法
你有几种可选的修复方式:
- 用
global声明变量:告诉Python这个变量是全局作用域的,函数内部可以修改它:my_var = 'xxx' def my_func(): global my_var # 声明为全局变量 print(my_var) if my_var == 'xxx': my_var = 'yyy' if __name__ == '__main__': my_func() - 把变量作为参数传入函数:避免直接操作全局变量,这是更推荐的编程实践:
my_var = 'xxx' def my_func(var): print(var) if var == 'xxx': var = 'yyy' return var if __name__ == '__main__': my_var = my_func(my_var)
内容的提问来源于stack exchange,提问作者natebay
相关产品推荐
相关产品推荐

