You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:25:17