通俗的来说,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层的命名空间中。

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

来详细看看这段代码中的标识符。第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'层标识符在当前函数内可用。

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

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

python 命名空间冲突_python-命名空间相关推荐

  1. python命名空间特性_Python命名空间与作用域

    名称空间名称空间(namespaces):用于存放名字与内存地址绑定关系的地方,是对栈区的划分 作用:名称空间可以使栈区中存放相同的名字,从而解决命名冲突 名称空间分为三种:内置名称空间 全局名称空间 ...

  2. python函数作用域_Python命名空间和作用域的基本认识和一点小魔法

    作为初学者,简单总结自己对Python命名空间(namespace)和作用域(scope)的认识. Python在名称空间搜寻变量和函数的顺序可以认为是: 函数内部 -> (嵌套)父函数内部 - ...

  3. c python 内存冲突_Python在计算内存时应该注意的问题?

    我之前的一篇文章,带大家揭晓了 Python 在给内置对象分配内存时的 5 个奇怪而有趣的小秘密.文中使用了sys.getsizeof()来计算内存,但是用这个方法计算时,可能会出现意料不到的问题. ...

  4. python 命名空间报错_python命名空间与作用域

    命名空间不共享名称. 在命名空间中的名称能将任何python对象作为值,在不同的命名空间中相同的名称可以与不同的对象相关联.但是,如果存在名称解析协议,则多个命名空间可以一起工作来解析名称.也就是说, ...

  5. el 能否定义作用域变量_python命名空间和作用域

    一.命名空间 1.定义:命名空间(Namespace)是从名称到对象的映射 2.实现:大部分的命名空间都是通过 Python 字典来实现的 3.目的:命名空间提供了在项目中避免名字冲突的一种方法 4. ...

  6. Python基础 F-03 函数-命名空间与作用域

    函数-命名空间与作用域 文章目录 函数-命名空间与作用域 一.命名空间 1.1.定义与作用 1.2.分类 1.4.生命周期 命名空间创建周期 命名空间结束周期 二.作用域 2.1.定义与作用 2.2. ...

  7. python基础(7)-函数命名空间作用域闭包

    函数 动态参数 *args 1 def sum(*args): 2 ''' 3 任何参数都会被args以元组的方式接收 4 ''' 5 print(type(args)) # result:<c ...

  8. error C2872: “flann”: 不明确的符号 --- PCL 与OpenCV2 的flann命名空间冲突问题的解决方法...

    error C2872: "flann": 不明确的符号 - PCL 与OpenCV2命名空间冲突问题的解决方法 error C2872: "flann" 如果 ...

  9. error C2872: “flann”: 不明确的符号 --- PCL 与OpenCV2 的flann命名空间冲突问题的解决方法

    error C2872: "flann": 不明确的符号 - PCL 与OpenCV2命名空间冲突问题的解决方法 error C2872: "flann" 如果 ...

最新文章

  1. 自己编写jQuery动态引入js文件插件 (jquery.import.dynamic.script)
  2. matlab绘制y3=e (-x),MATLAB图形绘制-二维配套实验
  3. Android Loader 异步加载详解一:基础概念
  4. php表单中姓名必须使用汉字,我想在表单验证中加入中文姓名合法性模糊匹配判断?...
  5. 2018年手机摄像头模组市场调研报告
  6. MariaDB 10之并行复制--延迟测试结果
  7. 关于集成通用mapper的Mybatis代码生成器产生的model类注解
  8. B站校招面试官“炫耀资产、贬低应试者”?当事人发长文回应,北邮学子要求向学校道歉...
  9. 转载div+css布局教程之div+css常见布局结构定义
  10. webpack项目使用eslint建立代码规范
  11. xshell、xftp官方免费版下载
  12. Mac安装MySQL8碰到的问题
  13. bootstrap编写响应式页面
  14. 紫光集团或入股武汉新芯 赵伟国将任董事长
  15. 记STM32之PWM学习笔记 ---PWM原理
  16. eclipse oxygen配置tomcat
  17. Altium Designer 生成 BOM(Bill of Material)
  18. react中英文切换一
  19. 什么是网络钓鱼,攻击类型和防御?
  20. python计时器程序_Python计时器程序示例

热门文章

  1. java map用二叉树_【课堂笔记分享】linkedlist、二叉树、hashmap
  2. java 发送邮件_Jenkins实现自动化邮件发送踩坑记录
  3. qt5.13.2输出中文乱码
  4. BugkuCTF-Crypto题给你私钥吧
  5. php对象魔术方法,php学习之类与对象的魔术方法的使用
  6. 妖帝q群机器人_有关酷Q 晨风机器人,契约 qqlite qqlight ,mypc等QQ机器人关停一事的一点想法...
  7. html wap php,wap.php
  8. 切片分析报告格式_社科论文写作101-APA数据分析结果报告格式
  9. suse11安装python_suse linux 安装python Eric4
  10. php sql查询两个表语句,sql多表查询语句与方法