命名空间,英文名字:namespaces

在研习命名空间以前,请打开在python的交互模式下,输入:import this

>>> import this
The Zen of Python, by Tim PetersBeautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

这里看到的就是所谓《python之禅》,看最后一句: Namespaces are one honking great idea -- let's do more of those!

这是为了说明Namespaces、命名空间值重要性。

什么是命名空间

从“一切皆为对象”开始说起吧。对象,很多时候我们直接使用它并不方便,因此要给它取一个名字。打个比方,有这样一个物种,它是哺乳纲灵长目人科人属智人种,这就是所谓的对象,但是,在平时提及这个对象的时候,总是要说“哺乳纲灵长目人科人属智人种”,是不是太麻烦了?于是聪明的这个物种就为这个世界上的各种对象命名,例如将“哺乳纲灵长目人科人属智人种”这个对象命名为“人”。

在编程中也是如此,前面在讲述变量相关知识的时候已经说明了变量和引用对象的关系。

>>> a = 7
>>> id(7)
137589400
>>> id(a)
137589400
>>> id(7)==id(a)
True

看这个例子。7就是一个计算机内存中存在的对象,用id()这个内置函数可以查看7在内存(在RAM)中的地址。a 就是为这个对象预备的名字,如前面所讲的,它与内存中的一个编号为137589400的对象关联,或者说引用了这个对象,这个对象就是7.

如果做了下面的操作:

>>> a = a+1
>>> id(a)
137589388
>>> a
8
>>> id(8)
137589388

其实,上面操作中的a+1完成的是a引用的对象7+1,只不过是顺着对象7的命名a导入了对象7罢了,这样就在内存中建立了一个新的对象8,同样通过id()函数查看到内存中的地址,通过地址可以看到,这时候的a又自动引用对象8了.

>>> id(7)   #对象7在内存中的地址没变
137589400
>>> b = 7   #b引用此对象
>>> id(b)
137589400

上面a转换引用对象的过程,是自动完成的。而当b=7的时候,并不是在内存中从新建立一个对象7,而是b引用了已有的对象。这就是python的所谓动态语言的特点。

当然,可以给任何对象取名字,或者说为任何对象都可以建立一个所引用的变量。比如函数、类都可以,此处不赘述,前面已经多次用到了。

现在已经又一次明确了,每个名称(命名)——英文中的NAME有动词和名字两种,所以,由于中文的特点,似乎怎么说都可以,只要明白所指,因为中文是强调语境的语言——都与某个对象有对应关系。那么所谓的命名空间,就是这些命名(名称)的集合,它们分别与相应的对象有对应关系。

用一句比较学术化的语言说:

命名空间是从所定义的命名到对象的映射集合。

不同的命名空间,可以同时存在,当彼此相互独立互不干扰。

命名空间因为对象的不同,也有所区别,可以分为如下几种:

  • 内置命名空间(Built-in Namespaces):Python运行起来,它们就存在了。内置函数的命名空间都属于内置命名空间,所以,我们可以在任何程序中直接运行它们,比如前面的id(),不需要做什么操作,拿过来就直接使用了。
  • 全局命名空间(Module:Global Namespaces):每个模块创建它自己所拥有的全局命名空间,不同模块的全局命名空间彼此独立,不同模块中相同名称的命名空间,也会因为模块的不同而不相互干扰。
  • 本地命名空间(Function&Class: Local Namespaces):模块中有函数或者类,每个函数或者类所定义的命名空间就是本地命名空间。如果函数返回了结果或者抛出异常,则本地命名空间也结束了。

上述三种命名空间的关系

那么程序在查询上述三种命名空间的时候,就按照从里到外的顺序,即:Local Namespaces --> Global Namesspaces --> Built-in Namesspaces

还要补充说一下,既然命名空间中存在着命名和对象的映射,是“键值”对应的,例如:{"name":"hiekay","lang":"python"}

>>> def foo(num,str):
...     name = "hiekay"
...     print locals()
...
>>> foo(2,"hiekay.github.io")
{'num': 2, 'name': 'hiekay', 'str': 'hiekay.github.io'}
>>>

这是一个访问本地命名空间的方法,用print locals() 完成,从这个结果中不难看出,所谓的命名空间中的数据存储结构和dictionary是一样的。

根据习惯,如果访问全局命名空间,可以使用 print globals()。

作用域

作用域是指 Python 程序可以直接访问到的命名空间。“直接访问”在这里意味着访问命名空间中的命名时无需加入附加的修饰符。

程序也是按照搜索命名空间的顺序,搜索相应空间的能够访问到的作用域。

def outer_foo():b = 20def inner_foo():c = 30
a = 10

加入我现在位于inner_foo()函数内,那么c对我来讲就在本地作用域,而b和a就不是。如果我在inner_foo()内再做:b=50,这其实是在本地命名空间内新创建了对象,和上一层中的b=20毫不相干。可以看下面的例子:

#!/usr/bin/env python
#coding:utf-8def outer_foo():a = 10def inner_foo():a = 20print "inner_foo,a=",a      #a=20inner_foo()print "outer_foo,a=",a          #a=10a = 30
outer_foo()
print "a=",a                #a=30#运行结果inner_foo,a= 20
outer_foo,a= 10
a= 30

如果要将某个变量在任何地方都使用,且能够关联,那么在函数内就使用global 声明,其实就是曾经讲过的全局变量。

python 命名空间相关推荐

  1. Python命名空间

    命名空间namespace 定义 我对于命名空间的理解是,由变量名到对象的一个映射,相当于字典中的key对应一个values.所以在同一个环境中,不能有相同的key,但在不同的环境中,key的值是可以 ...

  2. Python命名空间的本质

    Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则. 接下来我将分四部分揭示Python命名空间的本质:一.命名 ...

  3. [转载] Python命名空间和作用域

    参考链接: Python命名空间和范围 Python命名空间和作用域 Python作用域和命名空间命名空间作用域 全局变量和局部变量global和nonlocal关键字 Python作用域和命名空间 ...

  4. python namespace,python命名空间(namespace)简单介绍

    python命名空间(namespace)简单介绍 发布时间:2020-09-08 07:20:33 来源:脚本之家 阅读:127 作者:人生与戏 命名空间: 每一个作用域变量存储的位置,或者解释为 ...

  5. [转载] 你真的知道什么是 Python“命名空间” 吗?

    参考链接: Python命名空间和范围 写在之前 命名空间,又名 namesapce,是在很多的编程语言中都会出现的术语,估计很多人都知道这个词,但是让你真的来说这是个什么,估计就歇菜了,所以我觉得 ...

  6. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  7. python 命名空间冲突_通过修改命名空间绕过pb冲突

    背景 在实际工作当中,很多服务框架本身会依赖pb,但是和tf的pb会发生冲突[通常是因为pb比较老或者版本有冲突导致],所以本文介绍如何通过修改名空间的方式来绕过pb冲突. 修改名空间&编译p ...

  8. Python命名空间和作用域

    变量是拥有匹配对象的名字(标识符).命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典. 一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量.如果一个局部变量和一 ...

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

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

  10. python控制modem的at指令_硬件设计MCU架构+Python命名空间和作用域

    硬件设计-MCU架构 CISC结构的单片机 其数据线和指令线分时复用,称为冯-诺伊曼结构 优点:指令丰富,功能较强,但确定取指令和取数据不能同时进行,速度受限,且价格也很高:属于CISC结构的单片机有 ...

最新文章

  1. httpd默认配置文件详解
  2. rxjs里merge operators的用法
  3. 太吾绘卷第一世攻略_耽美推文-BL-仿佛在攻略一只河豚
  4. 在线代码编辑器 Codemirror 的轻量级 React 组件
  5. phpmyadmin管理mysql_用phpMyAdmin管理MySQL数据库_MySQL
  6. 电脑怎么换自己的壁纸_怎么才能给自己的爱机一个合理的价格—想把自己电脑回收的...
  7. $.getJSON()不执行回调函数
  8. php 去除 bom,PHP批量检测并去除文件BOM头信息代码参考
  9. php 文件预览 水印,php实现在线预览word等office文件,同时添加水印
  10. nginx:工作原理
  11. 12306刷票工具(简单易学)
  12. 美国公布自动驾驶新政AV4.0;微软Access数据库出现漏洞,或致8.5万家企业面临风险;苹果谈论隐私问题……...
  13. python基础什么是函数的定义及用法
  14. SATA电源线的作用
  15. Designing Data-Intensive Applications翻译
  16. 地理信息技术类毕业论文文献有哪些?
  17. c#语言中if语句多条件,关于C# if语句中并列条件的执行
  18. 腾讯后端面试题python_腾讯后端开发,一面面试题分享
  19. 秒懂 Git 与 Gitee(码云)
  20. 分数的加减乘除(运算符重载)

热门文章

  1. calendar java day_of_month_Calendar的add方法中的DAY_OF_MONTH参数和DAY_OF_YEAR参数有什么区别?...
  2. Air32F103学习笔记-2.控制GPIO (一灯大师驾到)
  3. 红帽开放创新实验室: 帮助客户以红帽的方式进行创新
  4. vue 上传图片到oss / uniapp上传图片到oss
  5. B. Lunatic Never Content
  6. 我是如何从程序员到年入80万的自由职业者的
  7. AV1代码学习1:aomenc的main函数
  8. C语言quantity用法,Quantity-of-light adjusting device
  9. 因奋斗而骄傲,因梦想而高贵
  10. 【Python】实训9:家用热水器用户行为分析与事件识别(所谓的神经网络,BP)