当前位置:   article > 正文

【python3】 nonlocal关键字,与global的区别_python中unlocal是什么意思

python中unlocal是什么意思

目录

前言:

解释:

例子:


前言:

最近在python学习中遇到了nonlocal关键字但是感到困惑,于是记录nonlocal关键字用法。

解释:

nonlocal的意思就是将变量的作用域拓宽一个大一级的封闭的作用域( 拓宽后那个作用域不能是全局,否则等同于global了),并且与那个只比当前块作用域大一级的作用域的同名变量挂钩。

global的意思是将变量作用域拓宽到全局,也就是最大的封闭块

例子:

什么叫做一个封闭的作用域呢?

让我们来看以下例子和报错

作用域:其中grand_father()就是一个封闭的作用域,它比son()这个作用域大一级,而son()又比grand_son()这个作用域大一级。

如爷爷当年继承的家产,儿子辈虽然改写,但是只影响孙子辈继承的家产,不能跨越时空影响爷爷辈当年继承的家产。

  1. def grand_father():
  2. grand_father_wealth=10#祖辈当年继承的遗家产
  3. def son():
  4. #但是儿子辈改写祖辈家产(花了钱)只能影响到儿子辈和孙子辈访问祖辈遗产的值
  5. #若儿子辈进行了则该这里的grand_father_wealth已经跟爷爷辈的grand_father_wealth无关了
  6. grand_father_wealth=5
  7. print("儿子辈挥霍后的家产:",grand_father_wealth)
  8. def grand_son():
  9. print("孙子辈继承的家产:",grand_father_wealth)
  10. grand_son()
  11. son()
  12. print("儿子辈修改祖辈遗产后祖辈当年继承的家产:",grand_father_wealth)
  13. grand_father()
'
运行

结果:

  1. 儿子辈挥霍后的家产: 5
  2. 孙子辈继承的家产: 5
  3. 儿子辈修改祖辈遗产后祖辈当年继承的家产: 10

 那孙子辈想要跨越时空修改当年儿子辈的家产怎么办呢

使用nonlocal让自己的家产与儿子辈的家产挂钩

  1. def grand_father():
  2. grand_father_wealth=10#祖辈当年继承的遗家产
  3. def son():
  4. #但是儿子辈改写祖辈家产(花了钱)只能影响到儿子辈和孙子辈访问祖辈遗产的值
  5. #若儿子辈进行了则该这里的grand_father_wealth已经跟爷爷辈的grand_father_wealth无关了
  6. grand_father_wealth=5
  7. print("儿子辈挥霍后的家产:",grand_father_wealth)
  8. def grand_son():
  9. nonlocal grand_father_wealth
  10. print("孙子辈继承的家产:",grand_father_wealth)
  11. print("孙子辈跨越时空修改财富")
  12. #孙子辈跨越时空修改财富
  13. grand_father_wealth=12
  14. grand_son()
  15. print("孙子辈修改时空后父亲辈当年继承家产",grand_father_wealth)
  16. son()
  17. print("孙子辈修改家产后爷爷辈当年继承的家产:",grand_father_wealth)
  18. grand_father()
'
运行

结果为

  1. 儿子辈挥霍后的家产: 5
  2. 孙子辈继承的家产: 5
  3. 孙子辈跨越时空修改财富
  4. 孙子辈修改时空后父亲辈当年继承家产 12
  5. 孙子辈修改家产后爷爷辈当年继承的家产: 10

要注意的是,孙子辈只能使用nonlocal 来与父辈的继承家产进行挂钩,从而影响父辈当年继承家产,而不能影响爷爷辈当年继承的家产。

这就是nonlocal将变量的作用域拓宽一个大一级的封闭的作用域的意思。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/854603
推荐阅读
相关标签
  

闽ICP备14008679号