zoukankan      html  css  js  c++  java
  • 【Python成长之路】python 基础篇 -- global/nonlocal关键字使用

    课程起源

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

    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关键字定义的变量,无论在哪里变化,都可以直接改变内存中的值。

    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比较有实际用途,而且使用简单,建议掌握。

    作者:华为云享开发者 鹏哥贼厉害

  • 相关阅读:
    STS IDE 个性化修改
    tomcat发布web项目,支持域名
    执行 maven 命令 报错Unable to add module to the current project as it is not of packaging type 'pom'[转]
    从数组中返回最大长度的所有子数组
    springboot 1.5.x 使用tomcat8设置cookie的domain以dot开头报错
    tomcat服务器配置字符集为utf-8-彻底解决中文乱码问题
    通配符的匹配很全面, 但无法找到元素 'mvc:annotation-driven' 的声明
    Java原理之HashMap
    你应该知道的JAVA面试题
    sql 置顶功能的查询
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165149.html
Copyright © 2011-2022 走看看