zoukankan      html  css  js  c++  java
  • python3 nonlocal vs global

    考虑这样一个python程序:

    x = 12

    def func():

          x = 1

    func()

    print(x)

    输出为:x = 12

    因为函数内部定义的x被认为只属于局部作用域,为了表明我么引用的是全局的x而不是新定义一个局部的x,

    可以使用global关键字:

    x = 12

    def func();

        global x

        x = 1

    func()

    print(x)

    可以发现输出已经变成了1,也就是在函数内部成功修改了一个全局变量

    还有一种情形,就是嵌套的局部作用域的问题:

    def g():

        x = 12

        func():

             x = 1

        func()

        print(x)

    g()

    这样输出的结果为12,因为func函数调用时定义的X也被认为只属于局部作用域了,但是此时函数g()里定义的x并非全局变量,用前述的global关键字肯定是不行的,

    所以又有了nonlocal,这样写:

    def g():

         x = 12

         func():

             nonlocal x

             x = 1

         func()

         print(x)

    g()

    这时,输出的结果就是我们预期的1了,nonlocal就是声明要引用一个外部作用域(全局作用域除外)中定义的变量。

    需要指出的是,上述关键字之所以需要,是因为我们试图去修改全局变量或者处于外部作用域的变量,如果在局部作用域内部重定义全局变量或外部作用域变量,仅仅只读访问(比如print出来)是完全没有问题的,参看下面这个例子:

    a = 12
    def g():
        b = 11
        def func():
            print(a)
            print(b)
        func()
        return
    if __name__ == '__main__':
        g()

  • 相关阅读:
    android 休眠唤醒机制分析(三) — suspend
    android 休眠唤醒机制分析(一) — wake_lock
    开机音乐不发声的问题
    Linux的时钟管理
    Android4.2增加新键值
    _IO, _IOR, _IOW, _IOWR 宏的用法与解析
    Mifare 0简介
    Mifare 1卡的存储结构
    Maven 介绍
    DAL 层引用 System.Net.Http ,引发的一阵心慌
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4605480.html
Copyright © 2011-2022 走看看