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
相关产品推荐
相关产品推荐

