首先来看两段代码以及代码的执行结果:
- 代码一:
a = 0
def test():
print a
a += 1
test()
执行结果: ** UnboundLocalError: local variable 'a' referenced before assignment **
- 代码二:
a = 0
def test():
print a
b = a + 1
test()
执行结果: 0
第二段的代码的执行结果是1很好理解, 因为print a
的时候a
引用的是全局变量a
, 而此时全局变量a
的值是0。
但是为什么第一段代码在print a
的时候会报local variable 'a' referenced before assignment
的错呢?此时引用的a
难道不是全局变量a
吗?答案:不是。
要解释清楚这个问题,首先让我们来看看python
是如何确定在函数中引用的变量究竟是全局变量还是局部变量的,根据 文档可以看出有如下几个规则:
- 如果在函数内部使用了
global
修饰变量,那么引用的是全局变量 - 在没有使用
global
修饰变量时,如果在函数中没有对变量赋值,那么* 默认 *函数中引用的变量是全局变量 - 在没有使用
global
修饰变量时,如果在函数中对变量赋值了,那么默认函数中引用的是局部变量。
代码一中,由于在函数中使用a += 1
对变量a
赋值了,所以print a
时,引用的是局部, 而此时又还没执行到a += 1
所以会报错。
代码二中,由于整个函数都没有对变量a
赋值, 所以print a
时引用的是全局变量, 而全局变量a = 0
, 所以执行结果为0。
网友评论