目录
前言:
最近在python学习中遇到了nonlocal关键字但是感到困惑,于是记录nonlocal关键字用法。
解释:
nonlocal的意思就是将变量的作用域拓宽一个大一级的封闭的作用域( 拓宽后那个作用域不能是全局,否则等同于global了),并且与那个只比当前块作用域大一级的作用域的同名变量挂钩。
global的意思是将变量作用域拓宽到全局,也就是最大的封闭块
例子:
什么叫做一个封闭的作用域呢?
让我们来看以下例子和报错
作用域:其中grand_father()就是一个封闭的作用域,它比son()这个作用域大一级,而son()又比grand_son()这个作用域大一级。
如爷爷当年继承的家产,儿子辈虽然改写,但是只影响孙子辈继承的家产,不能跨越时空影响爷爷辈当年继承的家产。
def grand_father():
grand_father_wealth=10#祖辈当年继承的遗家产
def son():
#但是儿子辈改写祖辈家产(花了钱)只能影响到儿子辈和孙子辈访问祖辈遗产的值
#若儿子辈进行了则该这里的grand_father_wealth已经跟爷爷辈的grand_father_wealth无关了
grand_father_wealth=5
print("儿子辈挥霍后的家产:",grand_father_wealth)
def grand_son():
print("孙子辈继承的家产:",grand_father_wealth)
grand_son()
son()
print("儿子辈修改祖辈遗产后祖辈当年继承的家产:",grand_father_wealth)
grand_father()
结果:
儿子辈挥霍后的家产: 5
孙子辈继承的家产: 5
儿子辈修改祖辈遗产后祖辈当年继承的家产: 10
那孙子辈想要跨越时空修改当年儿子辈的家产怎么办呢
使用nonlocal让自己的家产与儿子辈的家产挂钩
def grand_father():
grand_father_wealth=10#祖辈当年继承的遗家产
def son():
#但是儿子辈改写祖辈家产(花了钱)只能影响到儿子辈和孙子辈访问祖辈遗产的值
#若儿子辈进行了则该这里的grand_father_wealth已经跟爷爷辈的grand_father_wealth无关了
grand_father_wealth=5
print("儿子辈挥霍后的家产:",grand_father_wealth)
def grand_son():
nonlocal grand_father_wealth
print("孙子辈继承的家产:",grand_father_wealth)
print("孙子辈跨越时空修改财富")
#孙子辈跨越时空修改财富
grand_father_wealth=12
grand_son()
print("孙子辈修改时空后父亲辈当年继承家产",grand_father_wealth)
son()
print("孙子辈修改家产后爷爷辈当年继承的家产:",grand_father_wealth)
grand_father()
结果为
儿子辈挥霍后的家产: 5
孙子辈继承的家产: 5
孙子辈跨越时空修改财富
孙子辈修改时空后父亲辈当年继承家产 12
孙子辈修改家产后爷爷辈当年继承的家产: 10
要注意的是,孙子辈只能使用nonlocal 来与父辈的继承家产进行挂钩,从而影响父辈当年继承家产,而不能影响爷爷辈当年继承的家产。
这就是nonlocal将变量的作用域拓宽一个大一级的封闭的作用域的意思。