• 【Python成长之路】python 基础篇 -- global/nonlocal关键字使用


    课程起源

    有一次在工作中编写python工具时,遇到一个 问题:从配置文件读取变量A后,无法在内存中把A的值改变成新的内容。为了解决“更新内存中变量”的这个问题,查找了一些帖子,结果发现了有个很简单的方便 -- 使用global关键字!

    2 global关键字

    官方对global关键字的作用说明如下:

    global关键字用来在函数或其他局部作用域中使用全局变量。

    不好理解没事,先上传一段简单的代码:

    x = 1
    def func():
        print(x)
    func()
    结果是:1

    虽然func函数里并没有传入x的值,但是在函数内打印变量x时,是按照函数内的局部变量 -> 全局变量。由于func()中没有局部变量x,因此就读取了全局变量的x=1。因此最后 打印的结果是1
           那么如果我加上局部变量x =2 ,那结果如下:

    x = 1
    def func():
        x =2
        print(x)
    func()
    print(x)
    
    结果是:
    2
    1

    函数内如果如何对x进行操作变化,都无法改变函数外的x值。这也就是我工作中遇到的问题简化版。
           为了解决这个问题,我们 需要学习下global关键字。

    x = 1
    def func():
        global x
        x =2
        print(x)
    func()
    print(x)
    
    结果是:
    2
    2

    只需要在func()加上global x声明,就可以把局部变量x=2变成全局变量,即改变了x在内存中的值。对应上述示例代码,第一个2是func内部打印的,第2个2是func外部打印的。
          因此,简单来说 ,global关键字定义的变量,无论在哪里变化,都可以直接改变内存中的值。

    3 nonlocal关键字

    其实一开始我并不知道有nonlocal这个关键字,但是许多大神的帖子都提到了这个函数,那我当然学习下!官方对 nonlocal作用的定义如下:

     nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。

    先来一段示例代码:

    x = 1
    def func():
        nonlocal x
        x =2
        print(x)
    func()
    print(x)
    
    结果代码报错,SyntaxError: no binding for nonlocal 'x' found

    为什么我只是把global换 成了nonlocal,却报错了?因为nonlocal是用于函数中的函数。

    x = 1
    def func():
        x = 2
        def subfunc():
            nonlocal x
            x = x + 1
            print('subfunc内打印的值:%d' % x)
            return x
        print('func内打印的值:%d' % x)
        return subfunc
    func()
    print('func外打印的值:%d' % x)
    
    结果是:
    func内打印的值:2
    func外打印的值:1

    nonlocal关键字既没有改变全局变量x=1的值,也没有改变局部变量x=2的值。这就是指nonlocal声明的变量不是局部变量,也不是全局变量。

    示例代码在func()里加了一个子函数subfunc(),但是从结果来看,似乎并没有执行subfunc()。这是为什么呢?因为我们只调用了func(),如果要调用subfunc()的话,要func()()

    x = 1
    def func():
        x = 2
        def subfunc():
            nonlocal x
            x = x + 1
            print('subfunc内打印的值:%d' % x)
            return x
        print('func内打印的值:%d' % x)
        return subfunc
    def func2():
        # 为了方便使用func()(),用变量F表示func()
        F = func()
        print('func2内第一次打印:%d' % F())
        print('func2内第二次打印:%d' % F())
    func2()
    
    结果是:
    func内打印的值:2
    subfunc内打印的值:3
    func2内第一次打印:3
    subfunc内打印的值:4
    func2内第二次打印:4

    从这段代码可以看到,subfunc()里的x变量从原来的2变成了3,所以nonlocal是改变了subfunc()子函数内的变量值,即外部嵌套函数内的变量。

    因此,简单地理解,被nonlocal定义后的变量,只会在被调用的子函数中起作用。

    课堂总结

    个人理解来看,global比较有实际用途,而且使用简单,建议掌握。

    (如果有什么建议和诉求,可以通过下面的留言区反馈,知无不言,一起学习!)

    作者:华为云合作开发者

  • 相关阅读:
    SGU 271 Book Pile (双端队列)
    POJ 3110 Jenny's First Exam (贪心)
    HDU 4310 Hero (贪心)
    ZOJ 2132 The Most Frequent Number (贪心)
    POJ 3388 Japanese Puzzle (二分)
    UVaLive 4628 Jack's socks (贪心)
    POJ 2433 Landscaping (贪心)
    CodeForces 946D Timetable (DP)
    Android Studio教程从入门到精通
    Android Tips – 填坑手册
  • 原文地址:https://www.cnblogs.com/huaweicloud/p/11861197.html
Copyright © 2020-2023  润新知