关于python的命名空间

前言:存在参考,侵删

  • python会有局部命名空间、全局命名空间和内建命名空间同时存在。
    • 局部命名空间记录函数内部的变量、传入函数的参数、嵌套函数等被命名的对象;
    • 全局命名空间记录模块的变量、函数、类及其它导入的模块等被命名的对象;
    • 内建命名空间记录Python自身提供的函数、模块等被命名的对象。

  • python在编译和解释执行Python代码的过程中,会为每个模块建立一个全局命名空间,为模块中的每个函数建立局部命名空间,所以不同模块的相同函数名互不影响。

  • python对变量在命名空间的查找顺序是:局部,全局,内建。

  • 如果存在嵌套函数(闭包或者lambda等函数式)的话:

    1、先在当前函数的命名空间中搜索,
    2、然后是在父函数的命名空间中搜索,
    3、接着是模块命名空间中搜索,
    4、最后在内置命名空间中搜索


  • python命名空间的生命周期:

    1、内置命名空间在 Python 解释器启动时创建,会一直保留,不被删除。
    2、模块的全局命名空间在模块定义被读入时创建,通常模块命名空间也会一直保存到解释器退出。
    3、当函数被调用时创建一个局部命名空间,当函数返回结果 或 抛出异常时,被删除。每一个递归调用的函数都拥有自己的命名空间。


  • Python提供了内建函数可以输出命名空间里面的内容。
    • 输出局部命名空间的内容使用locals()函数,输出全局命名空间的的内容使用globals()函数。
    • 另外:locals 实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行改变对局部名字空间中的变量值并无影响。globals 返回实际的全局名字空间,而不是一个拷贝。所以对 globals 所返回的 dictionary 的任何的改动都会直接影响到全局变量。

  • Python 的一个特别之处在于其赋值操作总是在最里层的作用域。
    • 赋值不会复制数据——只是将命名绑定到对象。删除也是如此:“del y” 只是从局部作用域的命名空间中删除命名 y 。事实上,所有引入新命名的操作都作用于局部作用域。

补充:

  • 这里只是命名空间的基础理解,其实它有很多有趣的应用,比如:反向解析…
  • 本文重在汇总和易于理解,具体代码请自行搜索。
发布了55 篇原创文章 · 获赞 3 · 访问量 2735

猜你喜欢

转载自blog.csdn.net/rusi__/article/details/103166044
今日推荐