赞
赏
如果我们在 函数 中定义了与 全局变量 同名的 变量 时,那么就会发生局部变量隐藏了全局变量的情形,这时候,我们可以通过在函数内部使用 global 关键字来解决。
同样,如果我们在函数内部定义的变量,与局部函数定义的变量重名,那么也会发生局部函数的变量会隐藏函数内部的变量,这时候我们就需要使用 nonlocal 关键字 来解决。
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。
当函数内部定义的变量,与局部函数定义的变量重名时,我们可以在局部函数内部使用 nonlocal 关键字来说明,我们在局部函数使用的是局部变量,而不是再次定义一个内部函数的局部变量。
Python 局部变量和全局变量重名
print("嗨客网(www.haicoder.net)")
def func():
site = "HaiCoder"
def func_inner():
print("In Func Site =", site)
site = "haicoder"
print("nonlocal Site =", site)
func()
程序运行后,控制台输出如下:
首先,我们在函数 func 内部,定义了一个局部变量 site,接着,我们在函数 func 里面,定义了一个局部函数 func_inner,同时,在局部函数 func_inner 里面,我们首先打印变量 site 的值,接着再次给变量 site 赋值。
最后,我们使用 print 打印局部变量 site 的值,输出了局部变量 site 的值,此时程序是正确的。
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()
程序运行后,控制台输出如下:
首先,我们在函数 func 内部,定义了一个局部变量 site,接着,我们在函数 func 里面,定义了一个局部函数 func_inner,同时,在局部函数 func_inner 里面,我们首先打印变量 site 的值,接着再次给变量 site 赋值。
最后,我们首先在函数内部调用函数 func_inner,接着再次调用函数 func,此时程序报错,理论上我们在 func_inner 函数里面第一次打印使用的应该是局部的变量 site,但实际上程序却把 func_inner 函数的第一次打印使用的变量定义为了局部函数里面的局部变量。
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()
程序运行后,控制台输出如下:
我们在局部函数内部,可以直接使用 nonlocal 关键字,表明我们在局部函数内部使用的变量是外部函数的变量,而不是我们先定义局部函数的局部变量。
如果我们在函数内部定义的变量,与局部函数定义的变量重名,那么也会发生局部函数的变量会隐藏函数内部的变量,这时候我们就需要使用 nonlocal 关键字来解决。