Python函数内对全局变量使用+=运算符触发UnboundLocalError问题咨询
问题原理说明
这个报错是Python的静态变量作用域绑定规则导致的,底层逻辑如下:
- Python在定义函数的编译阶段,会扫描函数内部的全部代码,只要检测到某个变量存在赋值操作(
+=属于隐式赋值,等价于num = num + 6),就会直接将该变量标记为当前函数的局部变量,执行阶段查找该变量时只会在函数局部作用域查找,不会向上检索全局作用域的同名变量。 - 你的代码中
num += 6触发了赋值规则,num被标记为add_num函数的局部变量,执行这行代码时需要先读取等号右侧的num值完成计算,但此时局部变量num还没有完成赋值操作,就会抛出UnboundLocalError。 - 如果函数内部没有对
num的赋值操作,Python就不会把它标记为局部变量,查找时会自动向上匹配全局作用域的num,就能正常读取值,这也是你之前只读取不赋值不会报错的原因。
常见解决方案
方案1:修改全局变量
如果需要函数内部修改全局的num,需要用global关键字显式声明,告诉Python该变量走全局作用域,不要标记为局部变量:
num = 3 def add_num(): global num num += 6 print(num) add_num() # 输出9 print(num) # 输出9
方案2:使用独立局部变量
如果不需要修改全局变量,只是函数内部要使用同名变量,提前给局部变量赋初始值即可:
num = 3 def add_num(): num = 3 # 局部变量赋初始值 num += 6 print(num) add_num() # 输出9 print(num) # 输出3
内容的提问来源于stack exchange,提问作者sean harricharan
相关产品推荐
相关产品推荐

