• CSIC_716_20191111【函数对象、名称空间、作用域、global 和nonlocal】


    函数名是可以被引用,传递的是函数的内存地址。函数名赋值给变量后,只需要在变量后加上括号即可调用函数。

    名称空间

    内置名称空间:在python解释器中提前定义完的名字

    全局名称空间:if、while、for循环中内部定义的变量,均是全局变量;存放于文件级别的变量,也是全局名称。

    局部名称空间:函数内定义的所有名称,均存放在当前函数的名称空间,属于局部名称空间。

    生命周期

    内置名称空间:解释器生效内置名称空间即生效,解释器关闭即失效。

    全局名称空间:.py文件生效全局名称空间生效,代码执行结束后失效。

    局部名称空间:调用当前函数时失效,函数体代码执行结束失效。

    名称空间查找顺序

    局部名称空间:先找局部的再找全局的最后找内置的

    全局名称空间:先找全局的,最后找内置的

    global和nonlocal

    如果在局部空间中申明global,被申明的变量会被当成全局变量。对其赋值会更新原先定义的同名全局变量的值。

    如果在局部空间中声明nonlocal,被申明的变量一定要在函数嵌套的第二级及以后,且前面一定要有同名的局部变量

    如果函数体中没有嵌套函数,函数体中是不能使用nonlocal声明变量。

    nonlocal x会从当前函数的外层函数开始,一层层去查找名字X,若是一直到最外层函数都找不到,则会报错。举例如下:

    def f3():
        x = 4
        def f1():
            y = 2
            def f2():
                nonlocal x
                x = 3
            f2()
            print(x)  # 3
        f1()
        print(x)  # 3
    f3()
    

      

    def f3():
        x = 4
        def f1():
            x = 2
            def f2():
                nonlocal x
                x = 3
            f2()
            print(x)  # 3
        f1()
        print(x)  # 4
    f3()
    

      

      

    函数体循环时,会从内往外找要寻找的值,先局部后全局,最后找内置。如果下级循环中没有值,会忘外层寻找,直到找到位置,遇到局部的global也会取其值,如下代码所示。(注意理解)

    x=0
    def func1():
        x = 1
        def func2():
            global x
            x = 2
            def func3():
                print(x, 'func3')  # 2 func3
            func3()
            print(x, 'func2')  # 2 func2
        func2()
        print(x,'func1')  # 1 func1
    func1()
    print( x,'all')  # 2 all
    

      

  • 相关阅读:
    7月15日考试 题解(链表+状压DP+思维题)
    暑假集训日记
    C# .NET 使用 NPOI 生成 .xlsx 格式 Excel
    JavaSE 基础 第42节 局部内部类
    JavaSE 基础 第41节 匿名内部类
    JavaSE 基础 第40节 内部类概述
    JavaSE 基础 第39节 接口的应用
    JavaSE 基础 第38节 接口的实现
    JavaSE 基础 第37节 接口概述
    JavaSE 基础 第36节 抽象类概述与使用
  • 原文地址:https://www.cnblogs.com/csic716/p/11835871.html
Copyright © 2020-2023  润新知