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

Python LEGB规则相关:函数访问全局变量触发UnboundLocalError咨询

Python变量作用域差异原因说明

核心判定规则

Python在编译函数代码阶段,会扫描函数内部的所有操作:

  • 如果函数内存在对某个变量的赋值操作(包括+=、-=这类隐式赋值),Python会直接将该变量标记为局部变量,执行时所有对该变量的访问都会优先从局部作用域查找,不会默认向上查找全局作用域的同名变量
  • 如果函数内只有对某个变量的读取操作,没有任何赋值操作,Python不会将其标记为局部变量,执行时会按照LEGB规则向上查找对应变量

两段代码的差异分析

第一段报错代码

total = 0

def two_digit_sum(n):
    for i in str(n):
        total += int(i)
    return total


number = 111
print(two_digit_sum(number))

代码中total += int(i)属于隐式赋值操作,等价于total = total + int(i),因此Python会将total标记为two_digit_sum的局部变量。执行到赋值语句时,需要先读取右边的total值,但此时局部作用域的total还没有完成赋值,因此触发UnboundLocalError错误。

第二段正常运行代码

def spam():
    print(eggs)


eggs = 42
spam()

spam函数内只有对eggs的读取操作,没有任何赋值操作,Python不会将eggs标记为局部变量。执行print(eggs)时,会按照LEGB规则向上查找,最终找到全局作用域定义的eggs = 42,因此可以正常运行。

报错代码的修复方案

如果需要在函数内修改全局变量,只需要在函数开头用global关键字声明变量即可:

total = 0

def two_digit_sum(n):
    global total
    for i in str(n):
        total += int(i)
    return total

内容的提问来源于stack exchange,提问作者Christian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 10:57:03