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

为何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。

对比前两个程序:

  1. 第一个函数里没有对x的赋值操作,Python会默认去全局作用域找x,所以能正常读取全局变量的值。
  2. 第二个函数里直接给局部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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 02:34:55