加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

nonlocal 和 global的原理及其差异

发布时间:2021-05-27 15:46:46 所属栏目:编程 来源:互联网
导读:对变量名的赋值和引用,是两种不同的情况: 赋值:创建一个变量或者修改。 引用:检索其值。 以上两者的差别,会导致我们在函数中: 赋值一个 全局变量:等于创
副标题[/!--empirenews.page--]

nonlocal 和 global的原理及其差异


对变量名的赋值和引用,是两种不同的情况:

赋值:创建一个变量或者修改。

引用:检索其值。

以上两者的差别,会导致我们在函数中:

赋值一个

全局变量:等于创建一个局部变量。

自由变量:等于创建一个局部变量。

引用:正常检索其值。

我们修改上例中的inner函数为如下形式:

def inner(i1,i2='i2'): 

    e = 'enclose' 

    g = 'inner global' 

    print(i1,i2,o1,o2,e,g,b) 

在嵌套函数内,重新定义了g变量,其他语言一般理解这是重新赋值全局变量。但是我们看上条规则:在函数中,赋值一个全局变量时,等于创建一个局部变量。就是说此时的g已经是局部变量了——在程序最后的 print(g) 语句输出 global,而不是修改后的 inner global 也验证了以上规则。

完整代码如下:

import builtins 

 

builtins.b = 'builtins' 

g = 'global' 

 

def outer(o1,o2='o2'): 

    e = 'enclose' 

    g = 'inner global' 

    def inner(i1,i2='i2'): 

        print(i1,i2,o1,o2,e,g,b) 

    return inner  

 

fun = outer('o1')  

fun('i1') 

 

print(g) 

输出结果如下:

i1 i2 o1 o2 enclose inner global builtins 

global 

不重新赋值,只是使用全局变量和自由变量,则没有问题。

自由变量也是类似的情况。

为了解决局部作用域中赋值全局变量和自由变量导致的变成局部变量问题,Python引入关键字 global 和 nonlocal 。

def inner(i1,i2='i2'): 

    global g 

    nonlocal e 

    g = 'inner global' 

    e = 'inner enclose' 

此时的赋值,则分别是对全局变量和自由变量的操作,而非新建局部变量。

完整代码如下:

import builtins 

 

builtins.b = 'builtins' 

g = 'global' 

 

def outer(o1,o2='o2'): 

    e = 'enclose' 

    def inner(i1,i2='i2'): 

        global g 

        nonlocal e 

        g = 'inner global' 

        e = 'inner enclose' 

        print(i1,i2,o1,o2,e,g,b) 

    return inner  

 

fun = outer('o1')  

fun('i1') 

 

print(g) 

输出结果如下:

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读