• 关于global 和 nonlocal你需要注意的问题


    global 和 nonlocal

    • 在Python中,当引用一个变量的时候,对这个变量的搜索是按找本地作用域(Local)、嵌套作用域(Enclosing function locals)、全局作用域(Global)、内置作用域(builtins模块)的顺序来进行的,即所谓的LEGB规则。
    • 然而当在一个函数内部为一个变量赋值时,并不是按照上面所说LEGB规则来首先找到变量,之后为该变量赋值。在Python中,在函数中为一个变量赋值时,有下面这样一条规则:

      当在函数中给一个变量名赋值是(而不是在一个表达式中对其进行引用),Python总是创建或改变本地作用域的变量名,除非它已经在那个函数中被声明为全局变量.

    global

    #示例一:
    a = 1
    def foo():
        b = a
        return b
    ​
    print(foo())   #结果: 1。  foo()内部没有定义1,它向上层找到了全局变量a
    #示例二:
    a = 1
    def foo():
        b = a
        a = 2 # newline
        return b
    ​
    print(foo())   #会报错 UnboundLocalError: local variable 'a' referenced before assignment
    #示例三:
    a = 1
    def foo():
        global a
        b = a
        a = 2 # newline
        return b
    ​
    print(foo())    #输出1。global关键字声明,foo()中的a即是全局变量a,后面的都是赋值语句。

    nonlocal

    #示例一:
    a = 1
    def foo():
        nonlocal a
        b = a
        a = 1
        return b
    print(foo())    #SyntaxError: no binding for nonlocal 'a' found   表明nonlocal不能声明全局变量。
    #示例二:
    def foo_upper():
        a = 1
        def foo():
            nonlocal a
            b = a
            a = 1
            return b
        print(foo())
    ​
    foo_upper()     #输出1

     

  • 相关阅读:
    ICEY修改实现ICEY锁血,修改data文件实现主之名关卡重现,顺便改金币
    gg修改器修改聚爆
    MOUSE_OVER 与 ROLL_OVER
    Tween 没有完毕 就停止
    如何将FLex AIR运行环境与AIR程序一起打包(转http://www.awsws.com/?p=94)
    做项目如做人
    flex 打开外部的swf 并调用其方法
    air 零散知识
    贝塞尔曲线的绘制
    air 读取sqlite的Date类型 解决方案
  • 原文地址:https://www.cnblogs.com/lilinyuan5474/p/11696777.html
Copyright © 2020-2023  润新知