美文网首页
命名空间、作用域及生命周期

命名空间、作用域及生命周期

作者: w_wm_m | 来源:发表于2018-11-18 12:51 被阅读0次
    命名空间.png

    作用域

    Tips:作用域是针对变量而言的,指申明的变量在程序里的可应用范围。或者称为变量的可见性。

    • 内建作用域:
    • 全局作用域:
    • 嵌套作用域:
    • 局部作用域:
    • 代码块不会产生作用域

    命名空间

    Tips:命名空间是一个字典的实现,键为变量名,值是变量对应的值。各个命名空间是独立没有关系的,一个命名空间中不能有重名,但是不同的命名空间可以重名而没有任何影响。

    • 内置命名空间:Python自带的内建命名空间,任何模块均可以访问,放着内置的函数和异常。
    • 全局命名空间:每个模块加载执行时创建的,记录了模块中定义的变量,包括模块中定义的函数、类、其他导入的模块、模块级的变量与常量。
    • 局部命名空间:每个函数所拥有的命名空间,记录了函数中定义的所有变量,包括函数的入参、内部定义的局部变量。

    生命周期

    • 内建命名空间:在Python解释器启动时创建,一直保留到Python解释器退出。
    • 全局命名空间:在模块被加载时创建,通常一直保留到Python解释器退出。
    • 局部命名空间:在函数调用时才被创建,但返回函数结果或抛出异常时被删除。
    • Python解释器加载阶段会创建出内建命名空间,模块的全局命名空间,局部命名空间是在运行阶段函数被调用时动态创建出来的,函数调用结束动态销毁。
    • 各命名空间的创建顺序:Python解释器启动->创建内建命名空间->加载模块->创建全局命名空间->函数调用->创建局部命名空间。
    • 各命名空间的销毁顺序:函数调用结束->销毁函数对应的局部命名空间->Python虚拟机(解释器)退出->销毁全局命名空间->销毁内建命名空间。

    两个关键字和两个函数

    global

    (1)


    static_code.png
    static_result.png

    (2)


    static_code.png
    static_result.png
    • 对于第一个程序来说,函数外的x是全局命名空间的,并绑定的值为2,调用函数创建局部命名空间,函数里的x是局部命名空间的,绑定值为4,互不影响。
    • 对于第二个程序来说,同理,函数外的x是全局命名空间的,绑定值为2,调用函数创建局部命名空间,显然,函数里的x定义为局部命名空间的变量,x+=2分成两步执行,先执行x+2,再将结果赋值给x。但在执行x+2时,局部命名空间的x并没绑定值,所以报错。


      global.png
      global_result.png
    • 关键字global的作用就是,将局部命名空间的变量申明为全局变量。但是这样做并不安全,可以采用参数和返回值的方法修改全局变量。
    nonlocal
    local.png
    local_result.png
    • 与上面同理,inner中的x并没绑定值,所以报错。


      nonlocal.png
      nonlocal_result.png
    • nonlocal声明的变量表示在离它最近一层的局部命名空间里。
    globals()和locals()
    • globals():用于查看全局命名空间的变量。
    • locals():用于查看当前局部命名空间的变量。
    • 需要注意的是,当在全局命名空间使用locals()时,查看的是全局命名空间的变量。

    相关文章

      网友评论

          本文标题:命名空间、作用域及生命周期

          本文链接:https://www.haomeiwen.com/subject/lerifqtx.html