Python同名全局变量赋值局部变量时UnboundLocalError问题咨询
为什么Python中局部变量赋值前引用会触发UnboundLocalError?
这个问题其实是Python的变量作用域解析规则导致的,这个行为在Python 2和3中是一致的,我来给你拆解清楚:
首先看你的两个函数:
- 对于
f(),函数内部没有对a的赋值操作,所以Python会按照LEGB(局部作用域→嵌套作用域→全局作用域→内置作用域)的顺序往上查找a,最终找到全局的a=1,所以能正常输出结果。 - 而
g()里有a = a这个赋值语句——Python在编译函数代码的时候,只要检测到函数内部存在对某个变量的赋值操作,就会直接把这个变量标记为局部变量,不管这个赋值语句写在函数的哪个位置。
这就导致执行a = a时,右边的a会被当作局部变量来解析,但此时这个局部的a还没有被赋值,自然就抛出UnboundLocalError了。
举个更直观的例子,下面这段代码也会触发同样的错误:
a = 10 def h(): print(a) # 这里会报错,因为下面有对a的赋值 a = 20 h()
如果你的需求是在函数里先引用全局的a再重新赋值,只需要用global关键字声明a是全局变量即可,修改后的g()是这样的:
a = 1 def g(): global a a = a print(a) g() # 正常输出1
内容的提问来源于stack exchange,提问作者andrew
相关产品推荐
相关产品推荐

