Python变量作用域疑问:为何print可访问全局a,a+=2却报错?
Python全局变量访问与自增操作的作用域差异
先看报错的代码示例:
a = 0 def func(): a += 2 print(a) func() print(a)
执行时会抛出错误:UnboundLocalError: local variable 'a' referenced before assignment
再看正常运行的代码:
a = 0 def func(): print(a) func() print(a)
执行后会依次输出0和0。
核心原因
这是Python的变量作用域解析规则导致的:
- 当函数内部存在对变量的赋值操作(包括
+=这种隐含赋值的复合操作)时,Python解释器会默认该变量是局部变量,优先在函数内部的局部作用域中查找它。
对于a += 2,它等价于a = a + 2——这里先引用了a,再对它赋值。但解释器已经认定a是局部变量,此时局部作用域里还没定义a,就会抛出"引用前未赋值"的错误。 - 当函数内部只有对变量的读取操作(比如
print(a))时,Python会沿着作用域链向上查找,先找局部,再找全局,最终找到全局作用域中的a,所以能正常运行。
解决方法
如果要让自增操作正常访问全局变量,只需用global关键字在函数内声明该变量为全局变量:
a = 0 def func(): global a a += 2 print(a) func() print(a)
执行后会依次输出2和2。
内容的提问来源于stack exchange,提问作者doofus
相关产品推荐
相关产品推荐

