Python中的命名空间理解为一个集合,在这个集合里有很多名字,同一个集合里一个名字只能出现一次,不同集合中相同的命名不会冲突,命名空间的主要目的是避免歧义——一个命名空间就像是一个房子, 当你叫房子里某个人的名字,不会同时有两个人以为在叫自己。 Python程序中,通常会存在如下3种可用的命名空间:
1、每个函数都有自己的命名空间,叫作局部命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量;
2、每个模块都有自己的命名空间,叫作全局命名空间,它记录了模块的变量,包括函数、类、其他导入的模块、模块级的变量和常量;
3、还有就是内置命名空间,任何模块均可访问它,它存放内置的函数和异常。
函数定义(包括 def 和 lambda)会产生新的命名空间。Python搜索某个名字的顺序是“LEGB”,四个字母分别是指4层命名空间,具体说明如下:
最里面的1层是L(ocal),表示在一个函数定义中,而且在这个函数里面没有再包含(嵌套)函数的定义。
第2层是E(enclosing function),表示在一个函数定义中,但这个函数里面还包含函数的定义,其实L层和E层只是相对的。
第3层是G(lobal),是指一个模块的命名空间。也就是说,在一个.py文件中定义的名字,但不在一个函数中。
第4层是B(uiltin),是指python解释器启动时就已经具有的命名空间。之所以叫builtin是因为在python解释器启动时会自动载入__builtin__模块,这个模块中的list、str等内置函数处于内置层的命名空间中。
命名空间真实存在,可以用 locals() 函数获取当前作用域的命名空间,用 globals() 函数可以在任意位置获取全局命名空间。