参考链接: 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. java文件出现字符串_找出三个文本文件中都出现的字符串,并输出到一个文本文件(菜鸟求救)...
  2. gimp and screenshot
  3. 网页性能优化01-精灵图利弊与应用场景
  4. BZOJ1044: [HAOI2008]木棍分割 (二分 + DP)
  5. cmd - 使用curl命令的注意点
  6. dataguard 下主备 online redo 与 standby redo log resize 重建
  7. wshShell.SendKeys模拟键盘操作
  8. CEC2018:动态多目标测试函数DF6~DF9的PS及PF(提供Matlab代码)
  9. python羊车门问题的蒙特卡洛解法
  10. 不同浏览器对键盘事件的不同认知
  11. 图片、文本、文件如何在线生成二维码?
  12. 云计算背景下企业发展出现新变化
  13. python删除软件后cmd还是返回版本信息
  14. 手机内存卡转化linux,怎样把手机内存移至sd内存卡
  15. whistle工具常用功能
  16. 微信小程序前端拉取放激励广告全步骤教程
  17. CPaintDC和CDC
  18. 解决sim800c模块不能连续给多个手机号码发短信问题
  19. 使用Iterator遍历map以及list用法
  20. 某网站有关PAC的讨论

热门文章

  1. 一只青蛙跳向三个台阶_Java版剑指offer编程题第9题--变态跳台阶
  2. iphone连不上微软服务器,windows没法连接到iphone是什么意思
  3. 管理mysql表知识点,数据库知识点整理(全)
  4. 实现一个行内三个div等分_css 实现等分布局
  5. mininet编程实现交换机规则的插入、删除与修改。_Mysql闲聊之从Redo、Undo日志到MVCC实现原理
  6. 根据前序和中序构造整个二叉树
  7. 数据结构—队列、循环队列、双端队列
  8. UnityShader18:立方体贴图(上)
  9. bzoj 2429: [HAOI2006]聪明的猴子(最小生成树)
  10. pytorch之各类图像库的图片读写方式