Python命名空间详解

 更新时间:2014年08月18日 15:22:16   投稿:shichen2014  
这篇文章主要介绍了Python命名空间详解,非常重要的概念,需要的朋友可以参考下

通俗的来说,Python中所谓的命名空间可以理解为一个容器。在这个容器中可以装许多标识符。不同容器中的同名的标识符是不会相互冲突的。理解python的命名空间需要掌握三条规则:

第一,赋值(包括显式赋值和隐式赋值)产生标识符,赋值的地点决定标识符所处的命名空间

第二,函数定义(包括def和lambda)产生新的命名空间

第三,python搜索一个标识符的顺序是"LEGB"。

所谓的"LEGB"是python中四层命名空间的英文名字首字母的缩写。
最里面的一层是L(local),表示在一个函数定义中,而且在这个函数里面没有再包含函数的定义。
第二层E(enclosing function),表示在一个函数定义中,但这个函数里面还包含有函数的定义,其实L层和E层只是相对的。
第三层G(global),是指一个模块的命名空间,也就是说在一个.py文件中定义的标识符,但不在一个函数中。
第四层B(builtin),是指python解释器启动时就已经具有的命名空间,之所以叫builtin是因为在python解释器启动时会自动载入__builtin__模块,这个模块中的list、str等内置函数的就处于B层的命名空间中。

这三条规则通过一个例子来看比较明白。如下面例子所示:

>>> g = int('0x3', 0)
>>> def outFunc():
  e = 2
    g = 10
  def inFunc():
     l = 1
     return g + e
    return inFunc()
>>> outFunc() ===> 12

来详细看看这段代码中的标识符。
第1行,适用第一条规则“赋值产生标识符”,因此产生一个标识符g。“赋值的地点决定标识符所处的命名空间”,因为g是没有在一个函数定义中,因此g处于'G'层命名空间中。这一行中还有一个标识符,那就是int。那么int是在什么地方定义的呢?由于int是内置函数,是在__builtin__模块中定义的,所以int就处于'B'的层命名空间中。
第2行,适用第一条规则,由于def中包含一个隐性的赋值过程,这一行产生一个标识符outFunc,outFunc并不处于一个函数定义的内部,因此,outFunc处于'G'层命名空间中。此外,这一行还适用第二条规则,产生一个新的命名空间。
第3行,适用第一条规则,产生个标识符e,而且由于这是在一个函数定义内,并且内部还有函数定义,因此e处于'E'层命名空间中。
第4行要注意,适用第一条规则,产生一个标识符g,这个g与e一样外于'E'层命名空间中。这个g与第一行的g是不同的,因为所处的命名空间不一样。
第5行,适用第一条规则,产生一个处于'E'层命名空间的标识符inFunc。与第2行一样,这一行定义函数也产生一个新的命名空间。
第6行,适用第一条规则,产生一个标识符l,由于这个l处于一个函数内部,而且在这个函数内部没有其他函数的定义,因此l处于'L'层命名空间中。
第7行,适用第三条规则,python解释器首先看到标识符g,按照LEGB的顺序往上找,先找L层(也就是在inFunc内部),没有。再找E层,有,值为10。因此这里的g的值为10。寻找过程到为止,并不会再往上找到'G'层。寻找e的过程也一样,e的值为2。因此第9行的结果为12。

其实,所谓的“LEGB”是为了学术上便于表述而创造的。让一个编程的人说出哪个标识符处于哪个层没有什么意义,只要知道对于一个标识符,python是怎么寻找它的值的就可以了。其实找值的过程直观上也很容易理解。

通过上面的例子也可以看出,如果在不同的命名空间中定义了相同的标识符是没有关系的,并不会产生冲突。寻找一个标识符的值过程总是从当前层开始往上找的,首先找到的就为这个标识符的值。也由此可以这么说,'B'层标识符在所有模块(.py文件)中可用;'G'层标识符在当前模块内(.py文件)中可用;'E'和'L'层标识符在当前函数内可用。

再来看一个例子,来解释global语句的用法。代码如下所示:

>>> g = 'global'
>>> s = 'in'
>>> def out():
    g = 'out'
    def inter():
     global g     
     print s,g
  inter()
>>> out() ===> 'in global'

可以看到,虽然有两个层中的g,但使用了global语句后,就是指'G'层的标识符。也就是第7行中的g,就是指第1行产生的那个g,值为'global'。

最后说一句,其实只要在编程的时候注意一下,不要使用相同的标识符,基本上就可以避免任何与命名空间相关的问题。还有就是在一个函数中尽量不要使用上层命名空间中的标识符,如果一定要用,也最好使用参数传递的方式进行,这样有利于保持函数的独立性。

相关文章

  • 对Python定时任务的启动和停止方法详解

    对Python定时任务的启动和停止方法详解

    今天小编就为大家分享一篇对Python定时任务的启动和停止方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • 把vgg-face.mat权重迁移到pytorch模型示例

    把vgg-face.mat权重迁移到pytorch模型示例

    今天小编就为大家分享一篇把vgg-face.mat权重迁移到pytorch模型示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python使用tkinter实现简单计算器

    python使用tkinter实现简单计算器

    这篇文章主要为大家详细介绍了python使用tkinter实现简单计算器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 为python爬虫docker镜像添加nodejs环境实现方法

    为python爬虫docker镜像添加nodejs环境实现方法

    这篇文章主要为大家介绍了为python爬虫docker镜像添加nodejs环境实现方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Python全栈之字符串和列表相关操作

    Python全栈之字符串和列表相关操作

    这篇文章主要为大家介绍了Python字符串和列表相关操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • 为什么是 Python -m

    为什么是 Python -m

    这篇文章给大家介绍了Python -m的含义及python -m 和 python 的区别解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-06-06
  • 一文带你了解Python中的延迟绑定

    一文带你了解Python中的延迟绑定

    Python中的延迟绑定是指在嵌套函数中,内部函数在被调用时才会绑定外部函数的变量,而不是在定义内部函数时就绑定。本文将通过一些例子带大家深入了解Python中的延迟绑定,感兴趣的可以了解一下
    2023-05-05
  • Python快速将ppt制作成配音视频课件的操作方法

    Python快速将ppt制作成配音视频课件的操作方法

    最近在捣鼓配音视频课件的制作方法,发现使用Moviepy进行合成比图形操作界面的合成软件效果更好,可以完美的解决音频和ppt材料的协同问题,下面就详细介绍一下这个过程,供ppt视频课件制作生手提供一个可以高效制作视频的方法
    2021-06-06
  • Flask蓝图学习教程

    Flask蓝图学习教程

    在Flask中,使用蓝图Blueprint来分模块组织管理。蓝图实际可以理解为是一个存储一组视图方法的容器对象,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • python安装以及IDE的配置教程

    python安装以及IDE的配置教程

    Python在Linux、windows、Mac os等操作系统下都有相应的版本,不管在什么操作系统下,它都能够正常工作。除非使用平台相关功能,或特定平台的程序库,否则可以跨平台使用。今天我们主要来探讨下windows系统下的安装与配置
    2015-04-04

最新评论