• 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
    

      

  • 相关阅读:
    awk,seq,xarg实例使用
    Docker安装yapi
    基于阿里搭载htppd访问
    锐捷结课作业
    基于centos7搭建kvm
    基于django实现简易版的图书管理系统
    python 自定义log模块
    Interesting Finds: 2008.01.13
    Interesting Finds: 2008.01.24
    Interesting Finds: 2008.01.17
  • 原文地址:https://www.cnblogs.com/csic716/p/11835871.html
Copyright © 2020-2023  润新知