报错案例:未声明全局变量,而在局部作用域内对其进行修改
x = 5
def func_a():
print(x)
return
def func_b():
x = x + 1
print(x)
return
func_a()
func_b()
print(x)
程序输出如下,
分析:
根据Python访问局部变量和全局变量的规则:当搜索一个变量时,Python先从局部作用域开始搜索。如果局部作用域没有找到那个变量,那Python就会按照作用域范围逐层寻找。寻找顺序为:局部作用域→闭包函数外的函数中→全局作用域→内建作用域。
如果找不到,则抛出UnboundLocalError
异常。
但上述代码中,已将x
声明为全局变量,并赋值为5,为什么还会报UnboundLocalError
?
因为内部函数在引用外部函数的同名变量或全局变量,并且对这个变量有修改时,Python会认为它是一个局部变量。在上述代码中,func_b()函数内没有对局部变量x的定义和赋值,所以报错。
global
关键字专为解决此类问题而生。在func_b()
函数内,加入global x
,显式地告知Python解释器x
为全局变量,Python会在全局作用域内找到x
的定义,执行完x = x + 1
后,x
依然是全局变量。
代码如下,
x = 5
def func_a():
print(x)
return
def func_b():
global x
x = x + 1
print(x)
return
func_a()
func_b()
print(x)
程序运行结果为,
5
6
6