Bootstrap

【python3】 nonlocal关键字,与global的区别

目录

前言:

解释:

例子:


前言:

最近在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将变量的作用域拓宽一个大一级的封闭的作用域的意思。

 

 

;