Python中的命名空间是什么?

In Python,every name introduced has a place where it lives and can be hooked for.

This is known as namespace. It is like a box where a variable name is mapped to the object placed.

Whenever the variable is searched out, this box will be searched, to get corresponding object.

namespace命名空间

Namespace(只)是 从名字到对象的一个映射(a mapping from name to objects) 。大部分namespace都是按Python中的字典来实现的。

有一些常见的namespace:built-in中的集合( abs() 函数等)、一个模块中的全局变量等。

从某种意义上来说,一个对象(object)的所有属性(attribute)也构成了一个namespace。在程序执行期间,可能(其实是肯定)会有多个命名空间同时存在。不同namespace的创建/销毁时间也不同。

此外,两个不同namespace中的两个相同名字的变量之间没有任何联系。

scope作用域

Scope是Python程序的一块文本区域(textual region)。

在该文本区域中,对namespace是可以直接访问,而不需要通过属性来访问。

Scope是定义程序该如何搜索确切地“名字-对象”的名空间的层级关系。
(The “scope” in Python defines the “hirerchy level” in which we search namespaces for
certain “name-to-object” mappings.)

Tip

直接访问:对一个变量名的引用会在所有namespace中查找该变量,而不是通过属性访问。

属性访问:所有名字后加 . 的都认为是属性访问。

如 module_name.func_name ,需要指定 func_name 的名空间,属于属性访问。
而 abs(-1) , abs 属于直接访问。

 

那什么是命名空间/作用域呢?

这两个概念,是用来描述一个变量的属性的,它们的意思,就是字面意思:“这个变量起名字的地方/这个变量起作用的域”.

LEGB-rule

在一个Python程序运行中,至少有4个scopes是存在的。

直接访问一个变量可能在这四个namespace中逐一搜索。

  • Local(innermost)
    包含局部变量。
    比如一个函数/方法内部。
  • Enclosing
    包含了非局部(non-local)也非全局(non-global)的变量。
    比如两个嵌套函数,内层函数可能搜索外层函数的namespace,但该namespace对内层函数而言既非局部也非全局。 
  • Global(next-to-last)
    当前脚本的最外层。
    比如当前模块的全局变量。 
  • Built-in(outtermost)
    Python __builtin__ 模块。
    包含了内建的变量/关键字等。 

那么,这么多的作用域,Python是按什么顺序搜索对应作用域的呢?

著名的”LEGB-rule”,即scope的搜索顺序:

Important

Local -> Enclosing -> Global -> Built-in

怎么个意思呢?

当有一个变量在 local 域中找不到时,Python会找上一层的作用域,即 enclosing 域(该域不一定存在)。enclosing 域还找不到的时候,再往上一层,搜索模块内的 global 域。最后,会在 built-in 域中搜索。对于最终没有搜索到时,Python会抛出一个 NameError 异常。

作用域可以嵌套。比如模块导入时。

这也是为什么不推荐使用 from a_module import * 的原因,导入的变量可能被当前模块覆盖。

参考:http://www.cnblogs.com/sunchao1984/p/5377680.html

http://python.jobbole.com/81367/

转载于:https://www.cnblogs.com/zoe233/p/7427052.html

13.Python中的命名空间是什么相关推荐

  1. python中的命名空间指什么_13.Python中的命名空间是什么

    Python中的命名空间是什么? In Python,every name introduced has a place where it lives and can be hooked for. T ...

  2. python中的命名空间_深入理解Python中的命名空间和范围

    Python中的命名空间和范围 在Python中,每个包.模块.类.函数和方法函数都拥有一个"名称空间",其中解析了变量名称.下面本篇文章就来带大家认识一下Python中的命名空间 ...

  3. Python中的命名空间是什么?

    什么是pep? PEP代表Python Enhancement Proposal.它是一组规则,指定如何格式化Python代码以获得最大可读性. Python中的命名空间是什么? 命名空间是一个命名系 ...

  4. python中的命名空间指什么_python中命名空间

    原文章 由一个例子到python的名字空间 .这篇文章对python的命名空间做出了非常好的介绍,这里是我自己的一些理解. 例子1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  5. python elementtree 命名空间_用Python中的命名空间通过‘ElementTree’解析XML

    莫回无 注对于Python的ElementTree标准库来说,这是一个有用的答案,而不需要使用硬编码的命名空间.要从XML数据中提取命名空间的前缀和URI,可以使用ElementTree.iterpa ...

  6. 13.Python中的白鹅类型 (Goose Typing)

    <Python编程的术与道:Python语言进阶>视频课程 <Python编程的术与道:Python语言进阶>视频课程链接:https://edu.csdn.net/cours ...

  7. python中如何创建包_如何在Python中创建命名空间包?

    TL:博士: 在Python3.3上,您不必做任何事情,只要不在名称空间包目录中放置任何__init__.py,它就可以工作了.在pre-3.3中,选择pkgutil.extend_path()解决方 ...

  8. 13.python中的字典

    字典其实和之前的元祖和列表功能相似,都是用来储存一系列对象的.也就是一种可变容器,或者是我所比喻的革新派的菜单. 但也不是完全相同,我在之前曾经将字典称为特殊的'序列',是字典拥有序列的部分特性,但是 ...

  9. 13.python中web框架概念的引入。

    一.什么是web框架? 框架,就是一个为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的Web应用,本质 ...

最新文章

  1. XCMS V1.0 Beta1 发布
  2. ArduinoYun的电源插座
  3. java反序列化漏洞的一些gadget
  4. Web服务器性能压力测试工具http_load、webbench、ab、Siege使用教程
  5. BZOJ1305 [CQOI2009]dance跳舞 【网络流】
  6. Linux应用基本命令实验,实验二 linux基本命令的使用
  7. testlink php nginx,linux环境部署testlink步骤说明
  8. FPS游戏自动枪械识别+压枪(以PUBG为例)
  9. Matlab中文注释乱码问题解决方案
  10. SM3算法 (python)
  11. SpringBoot31 整合SpringJDBC、整合MyBatis、利用AOP实现多数据源
  12. 你的伙伴对你最大会话_经典对话台词友情
  13. JavaScript运筹帷幄,掌控全局
  14. 阿里云部署视频点播:学习文档使用Java程序部署视频点播基础用法之入门
  15. Android 12.0 修改系统默认字体的大小
  16. 趋势与新高的实战研究
  17. 合力亿捷云客服3.0 开启“全员客服”新时代
  18. 将数字编号翻译为英文编号(python)实现
  19. duet连win10,duetdisplay这个软件在win10上用不了?安装vs2015的时候想取消安装没有点取消...
  20. 生态伙伴开发实践 | 智慧检测实验室应用系统快速接入指令集数字底座

热门文章

  1. Activity启动模式singleInstance
  2. opencv利用投影法进行水平切割和垂直切割
  3. others_shellcode
  4. 动态内存的申请和释放
  5. 女士细线毛衣起多少针_手工编织毛衣各处针数和方法
  6. uniapp 如何生成二维码
  7. 计算机网络概述 网络的体系与标准化组织
  8. es bulk java_ES 操作之批量写-BulkProcessor 原理浅析
  9. Spring Cloud Config教程(四)快速开始
  10. 实验吧-密码学(三)