zoukankan      html  css  js  c++  java
  • Python3中 对local和nonlocal 关键字的改善认识(新手向)

    nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。

        nonlocal用于声明,修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量,如下实例:

    #!/usr/bin/python3

    def outer():
    num = 10
    def inner():
    nonlocal num # nonlocal关键字声明
    num = 100
    print(num)
    inner()
    print(num)
    outer()

    结果如下:
    100
    100

      当时学习的时候对于inner()输出的num值还可以理解,但是对于outer输出的num值就觉得不理解了,为什么不是10,毕竟在outer()里面已经有他自己的局部变量应该不会被修改,后来自己加多测试输出之后就廓然开朗啦了,示例如下:

    def outer():
    num =10
    def inner(): nonlocal num # nonlocal关键字声明 print('inner-nonlocal-num',num) num = 100 print('inner-local-num',num)
    print('outer-local-num',num) inner() print('outer-inner-local-num',num)outer()
    结果:
    outer-local-num 10
    inner-nonlocal-num 10
    inner-local-num 100
    outer-inner-local-num 100

    一看是不是就明白啦,两段代码不同之处只是在变量发生改变之前增加输出结果,从执行顺序看出:

      1. 首先输出outer()本局变量num的值:10

      2. 调用inner(),用nonlocal声明使用外部变量num(10),因此此时输出的是外部变量outer().num: 10

      3. inner()内部生成本局变量num = 100,所以第三次输出的是inner.num的值, 也就是100.

          实际上inner内部仅有一个num=100的本局变量,第二次输出的只是在inner函数里输出外部函数的变量的值。

      4. 第四次输出的num值是调用了inner()后的num值,实际上inner()里面只有1个num=100的局部变量,因此第四次输出的就是inner().num: 也就是100.

    此时重新看第一段代码对比之后就知道为什么输出这样的值了,

    最后最后,学习的时候,多思考多加测试数据是真的会帮助理解的哟~


    ---------------------
    作者:青创空间-小小L
    来源:CSDN
    原文:https://blog.csdn.net/luosongqing/article/details/75052763
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    006_tcpdump专题
    002_阿里监控平台的“打怪升级”之路
    001_谈阿里核心业务监控平台SunFire的技术架构
    001_前端面试集合
    007_zkCli.sh
    007_Chrome的Waterfall详解
    021_supervise进行管理利器
    028_shell脚本递归求值
    MySQL -- 在磁盘爆满后复制的状态
    MySQL -- 内存使用监控详解
  • 原文地址:https://www.cnblogs.com/ExMan/p/9812020.html
Copyright © 2011-2022 走看看