赞
踩
目录
最近在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将变量的作用域拓宽一个大一级的封闭的作用域的意思。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。