若在函数作用域中需要修改全局作用域或外层嵌套作用域中的变量,则需要使用global和nonlocal关键字。接下来,分别对关键字global和nonlocal的作用进行介绍。
1.global关键字
global关键字用于在函数作用域中修改全局变量。假设现在有一个test函数,其外部定义了一个全局变量a,其内部对全局变量a进行重新赋值,示例代码如下:
a = 100
def test():
a += 100
print(a)
test()
Traceback (most recent call last):
File "<stdin>", line1, in <module>
File "<stdin>", line2, in test
UnboundLocalError:local variable 'a' referenced before assignment
上述程序报错,提示“在赋值前引用了局部变量a”。但是,前面我们明明是可以在函数中访问全局变量的呀?而这里为什么会出错呢?
这就是Python与其他语言的不同之处了。在Python中,如果在函数内部对全局变量a进行修改,Python会把变量a当作是局部变量,而在进行“a+=100”之前,我们是没有声明局部变量a的,因此,程序会出现上述错误提示。
要想在函数内修改全局变量,我们可以在函数内使用global关键字进行声明,下面,我们对程序进行修改,示例代码如下:
a = 100
def test():
global a
a += 100
print(a)
test()
200
这下,程序不但没有报错,而且成功对全局变量a进行了修改。
2.nonlocal关键字
使用nonlocal关键字可以在函数作用域中修改嵌套作用域中的变量。下面,带大家看一个例子:
def func():
count = 1
def func_in():
count = 12
func_in()
print(count)
func()
1
上述代码定义了一个嵌套函数,其中,func为外层函数,func_in为内层函数。func函数中定义了一个变量count,func_in函数中对变量count重新赋值,并在func函数中输出count变量的值。由执行结果可知,内层函数func_in并没有对外层函数func中的变量count进行修改。而是重新定义了一个同名的变量count。若要修改外层函数func中的变量count,则需要在变量前使用nonlocal关键字,改后的示例代码如下:
def func():
count = 1
def func_in():
nonlocal count
count = 12
func_in()
print(count)
func()
12
由执行结果可知,内层函数成功修改了变量的值。
注意:
使用global关键字修饰的变量之前可以不存在,而使用nonlocal关键字修饰的变量在嵌套作用域中必须已经存在。
网友评论