Python nonlocal使用

Python nonlocal使用教程

如果我们在 函数 中定义了与 全局变量 同名的 变量 时,那么就会发生局部变量隐藏了全局变量的情形,这时候,我们可以通过在函数内部使用 global 关键字来解决。

同样,如果我们在函数内部定义的变量,与局部函数定义的变量重名,那么也会发生局部函数的变量会隐藏函数内部的变量,这时候我们就需要使用 nonlocal 关键字 来解决。

Python变量重名详解

语法

def func(): varname = val def func_inner(): print(varname) varname = val2 func_inner()

说明

首先,我们在函数 func 内部定义了一个局部变量 varname,并赋值为 val,同时,我们在函数 func 的局部函数 func_inner 中,首先打印变量 varname,接着再次给变量 varname 赋值。

最后,我们调用局部函数 func_inner,此时程序报错。因为,我们在局部函数 func_inner 里面定义的变量 varname 隐藏了函数 func 的局部变量 varname。

Python nonlocal解决变量重名

当函数内部定义的变量,与局部函数定义的变量重名时,我们可以在局部函数内部使用 nonlocal 关键字来说明,我们在局部函数使用的是局部变量,而不是再次定义一个内部函数的局部变量。

案例

Python局部变量和全局变量重名

Python 局部变量和全局变量重名

print("嗨客网(www.haicoder.net)") def func(): site = "HaiCoder" def func_inner(): print("In Func Site =", site) site = "haicoder" print("nonlocal Site =", site) func()

程序运行后,控制台输出如下:

49_python nonlocal.png

首先,我们在函数 func 内部,定义了一个局部变量 site,接着,我们在函数 func 里面,定义了一个局部函数 func_inner,同时,在局部函数 func_inner 里面,我们首先打印变量 site 的值,接着再次给变量 site 赋值。

最后,我们使用 print 打印局部变量 site 的值,输出了局部变量 site 的值,此时程序是正确的。

Python局部变量和全局变量重名

Python 局部变量和全局变量重名

print("嗨客网(www.haicoder.net)") def func(): site = "HaiCoder" def func_inner(): print("In Func Site =", site) site = "haicoder" func_inner() print("nonlocal Site =", site) func()

程序运行后,控制台输出如下:

50_python局部函数nonlocal.png

首先,我们在函数 func 内部,定义了一个局部变量 site,接着,我们在函数 func 里面,定义了一个局部函数 func_inner,同时,在局部函数 func_inner 里面,我们首先打印变量 site 的值,接着再次给变量 site 赋值。

最后,我们首先在函数内部调用函数 func_inner,接着再次调用函数 func,此时程序报错,理论上我们在 func_inner 函数里面第一次打印使用的应该是局部的变量 site,但实际上程序却把 func_inner 函数的第一次打印使用的变量定义为了局部函数里面的局部变量。

Python局部变量和全局变量重名

Python 局部变量和全局变量重名

print("嗨客网(www.haicoder.net)") def func(): site = "HaiCoder" def func_inner(): nonlocal site print("In Func Site =", site) site = "haicoder" func_inner() print("nonlocal Site =", site) func()

程序运行后,控制台输出如下:

51_python局部函数nonlocal.png

我们在局部函数内部,可以直接使用 nonlocal 关键字,表明我们在局部函数内部使用的变量是外部函数的变量,而不是我们先定义局部函数的局部变量。

Python nonlocal使用教程总结

如果我们在函数内部定义的变量,与局部函数定义的变量重名,那么也会发生局部函数的变量会隐藏函数内部的变量,这时候我们就需要使用 nonlocal 关键字来解决。