python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python nonlocal用法

python nonlocal的用法详解

作者:Zack1st_diu

这篇文章主要给大家介绍了关于python nonlocal用法的相关资料,最近在python学习中遇到了nonlocal关键字但是感到困惑,于是记录nonlocal关键字用法,需要的朋友可以参考下

官网的nonlocal的用法

1,非局部声明变量指代的已有标识符是最近外面函数的已声明变量,但是不包括全局变量。这个是很重要的,因为绑定的默认行为是首先搜索本地命名空间。nonlocal声明的变量只对局部起作用,离开封装函数,那么该变量就无效。

2,非局部声明不像全局声明,我们必须在封装函数前面事先声明该变量

3,非局部声明不能与局部范围的声明冲突

第一点:

count = 1 # 这里是声明的是全局变量,对于nonlocal来说全局变量是不包括的

def a():
    count = 'a函数里面' # 这里对于nonlocal来说就是外面的函数已声明的变量
    def b():
        nonlocal count # nonlocal count指的是函数b内
        print(count)
        count = 2
    b()
    print(count)

if __name__ == '__main__':
    a()
    print(count)
count = 1

def a():
    # count = 'a函数里面' # SyntaxError: no binding for nonlocal 'count' found
    def b():
        nonlocal count
        print(count)
        count = 2
    b()
    print(count)

if __name__ == '__main__':
    a()
    print(count)

像上面的代码,如果nonlocal执行前,没有在局部里先声明局部变量,就会报错找不到局部变量,因为nonlocal是不会查全局变量。

nonlocal的作用:

1,nonlocal可以让最里面的函数使用最近的一个外函数已声明的变量,将最里面的函数的局部变量设置和最近的一个外函数声明的变量为同一个变量(引用同一个内存地址)。例如下面的代码,c函数声明了nonlocal count,那么c函数就可以用最近函数b声明的count=2,并且可以对b.count赋值。(注意:nonlocal不会使用全局变量)

count = 1

def a():
    count = 'a函数里面'
    def b():
        count = 2
        print(count)
        def c():
            nonlocal count
            print(count)
        c()
    b()
    print(count)

if __name__ == '__main__':
    a()
    print(count)

2
2
a函数里面
1

案例:引用官网的例子对global,nonlocal,全局变量的关系解释

def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)

After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam

上面案例代码看出:

1,do_local函数下定义的局部变量spam不会改变scope_test函数定义的局部变量spam。
2,do_nonlocal函数下nonlocal非本地声明,将do_nonlocal函数下的局部变量spam声明为非do_nonlocal函数本地,而是将do_nonlocal.spam声明和scope_test.spam为同一个变量。
3,do_global函数下global全局声明spam为全局变量,但是依然不会改变scope_test.spam的局部变量,说明global全局声明对局部的变量不产生作用。
4,在全局引用全局声明global的全局变量spam是可以的。

总结 

到此这篇关于python nonlocal用法详解的文章就介绍到这了,更多相关python nonlocal用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文