Python函数访问全局变量疑问:为何Function2触发UnboundLocalError?
Python全局变量读取与修改的差异问题解析
先看你的测试代码:
number = 5 def Function1(): temp = number print(temp) def Function2(): number += 1 print(number) def Function3(): print(number) Function1() # >>> 5 Function2() # line 8, in Function2 # number += 1 # UnboundLocalError: local variable 'number' referenced before assignment Function3() # >>> 5
核心原因:Python的作用域判定规则
Python对变量的作用域判断逻辑很直接:
- 当函数内部只读取变量值时,会先在局部作用域查找,找不到就去全局作用域找。所以Function1和Function3能正常读取全局的
number,输出5。 - 但只要函数内部有赋值操作(包括
+=、=这类,哪怕是number = number +1这种先读再写的操作),Python会默认这个变量是局部变量,不再去全局作用域查找。
为什么Function2报错?
number +=1本质是number = number +1,这里有赋值动作,Python会把number标记为Function2的局部变量。但执行时,先需要读取number的值来计算number+1,这时候局部的number还没被定义(赋值在读取之后),所以就抛出了UnboundLocalError。
解决办法
在Function2开头用global关键字声明number是全局变量,告诉Python:这个变量我要操作的是全局的那个,不是局部的:
def Function2(): global number number += 1 print(number)
这样执行时,Python就会直接修改全局的number,不会再把它当成局部变量处理。
内容的提问来源于stack exchange,提问作者hjw
相关产品推荐
相关产品推荐

