参考链接: Python中的命名空间和范围

命名空间,英文名字:namespaces

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

>>> import this

The Zen of Python, by Tim Peters

Beautiful 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 = 20

def inner_foo():

c = 30

a = 10

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

#!/usr/bin/env python

#coding:utf-8

def outer_foo():

a = 10

def inner_foo():

a = 20

print "inner_foo,a=",a      #a=20

inner_foo()

print "outer_foo,a=",a          #a=10

a = 30

outer_foo()

print "a=",a                #a=30

#运行结果

inner_foo,a= 20

outer_foo,a= 10

a= 30

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

[转载] python 命名空间相关推荐

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

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

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

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

  3. Python命名空间

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

  4. Python命名空间的本质

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

  5. 化学人学python有前途吗-转载:python之蟒开启理论计算化学的新时代

    转载:python之蟒开启理论计算化学的新时代 (2014-01-23 23:04:00) 标签: python gaussian python之蟒开启理论计算化学的新时代 就像iphone和andr ...

  6. python将汉字转为拼音字母_科学网—[转载]python中文汉字转拼音 - 陈明杰的博文...

    将汉字转为拼音.可以用于汉字注音.排序.检索(Russian translation) . 特性根据词组智能匹配最正确的拼音. 支持多音字. 简单的繁体支持, 注音支持. 支持多种不同拼音/注音风格. ...

  7. (转载)Python 应用发布技术

    (转载)Python 应用发布技术 2011年08月09日 分类: 脚本 2009-04-08 17:05 722人阅读 评论(0) 收藏 举报 1. Python 应用发布技术收集如何 将Py应用打 ...

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

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

  9. [转载] Python之NumPy基础:数组与向量化计算

    参考链接: Python中的numpy.tanh 本博客为<利用Python进行数据分析>的读书笔记,请勿转载用于其他商业用途. 文章目录 1. NumPy ndarray:多维数组对象1 ...

最新文章

  1. linux命令安装openssl函数库,ubuntu安装openssl库
  2. java 默认函数,java 构造函数默认修饰符
  3. U-Boot常用命令
  4. python网课百度网盘-我的“便(bian)宜”Python网课第一课
  5. 200825C文件 复习
  6. Windows10 VS2019下使用CMake3.20.1打开PCL1.11.0程序
  7. 中文转数字 java_java将阿拉伯数字转换为中文数字
  8. Nginx实现HTTP反向代理配置
  9. 如何运用所掌握的技术构建一个完整的业务架构
  10. 【2018.06.21学习笔记】【linux高级知识 14.1-14.3】
  11. FormsAuthentication使用指南
  12. Error [ERR_INSPECTOR_ALREADY_ACTIVATED]解决方案
  13. JAVA五子棋小游戏
  14. 用甘特图控件VARCHART XGantt搞定项目管理
  15. 了解HTTP和HTPS的S之差
  16. 小程序的优势和劣势是什么?
  17. 饥荒联机版服务器搭建_饥荒联机版steam专用服务器快速搭建教程
  18. [bzoj3123][SDOI2013]森林
  19. 感谢谦哥的家族为中国相声事业做出了贡献。
  20. 自动生成统计报表功能

热门文章

  1. 【NOIP2010】【Luogu1179】数字统计(模拟,多位数分离)
  2. linux asm函数,Linux 字符设备驱动—— ioremap() 函数解析
  3. php中upload函数,PHP中文件的上传和下载常用函数
  4. python多个对象嵌套会有问题吗_Python列表嵌套常见坑点及解决方案
  5. checkbox 点击搜索失去焦点_早些年植入三焦点晶体矫正老花的人,现在怎么样了?...
  6. ajax angular点击事件_Angular的$http的ajax的请求操作(推荐)
  7. SQL Server数据库有关语法
  8. bzoj 1618: [Usaco2008 Nov]Buying Hay 购买干草(完全背包)
  9. ubuntu下启动、停止、重启apache2
  10. windows下安装Redis数据库