Python Namespace - 命名空间
命名空间
命名空间 namespace 对 python 来说是一个非常核心的概念,整个 python 虚拟机运行的机制与 namespace 概念有这非常紧密的联系.
从'赋值'说起, python 中的赋值语句是一类特殊的语句,原因是因为它们会影响 namespace.
python 中的赋值语句首先创建一个 对象 object,然后将 obj '赋值' 给一个名字 name (理解为赋值给一个变量)
赋值语句执行后, 我们的一个 name 和 object 的关联关系, 称之为'约束', 而'约束'的容身之地就是 '命名空间'.
在 python 中, 命名空间是通过一个 PyDictObject 对象实现的。
以'类'为例, class A(object): 属于'赋值' 语句, 可以通过 A.__dict__ 查看 A 的 namespace. 看个例子,
a = 1
def func():
a = 3
print('Func -> a = ',a) # print('Outer -> a = ',a) #
func()
print('Outer -> a = ',a) Output,
Outer -> a = 1 #2 #1 跟 #2 的不同结果表明, 两处的赋值语句是在不同的 namespace 中创建的'约束'
Func -> a = 3 #
Outer -> a = 1 # 外层的 变量 a 的值并没有受到 #1 处赋值语句 a = 3 的影响.
在一个 python 模块 module 内部, 可能存在多个 namespace, 而每一个 namespace 都与一个’作用域‘对应(一个’约束‘起作用的区域 - 即一段代码'块儿',称之为这个约束的作用域).
在上例中, def func():代码块儿就组建了一块儿作用域, 在这个作用域中 约束 'a = 3' 便起作用. 然而, 在函数定义语句 def 的'外层’是另一个作用域, 约束 ‘a = 1’ 起作用.
现在, 将 def func():中的赋值语句 'a = 3' 注释掉, 看一下儿输出,
Output of #a =3,
Outer -> a = 1
Func -> a = 1
Outer -> a = 1 可以看到, python 虚拟机向'外层作用域'的 namespace 中去搜索 a 的 约束 'a = 1', python 支持 '嵌套作用域'.
为了找到某个给定 name 所引用的对象, 应该用这个 name 在当前所属的 namespace 中查找. 若找到, 它就是与这个给定 name 相关的约束。
否则, 继续向外层 namespace 中查到, 并继续依次向外层检查外层作用域直到最外层嵌套作用域。
若还是没有找到 name 相对应的约束,则 raise exception -> ‘NameError: name 'name' is not defined’
Python Namespace - 命名空间的更多相关文章
- Python进阶 - 命名空间与作用域
Python进阶 - 命名空间与作用域 写在前面 如非特别说明,下文均基于Python3 命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字.对象及其绑定的文章. 1. 命名空 ...
- python的命名空间
Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则. 接下来我将分四部分揭示Python命名空间的本质:一.命名 ...
- Python中命名空间与作用域使用总结
1 引言 命名空间与作用域是程序设计中的基础概念,深入理解有助于理解变量的生命周期,减少代码中的莫名其妙bug.Python的命名空间与作用域与Java.C++等语言有很大差异,若不注意,就可能出现莫 ...
- 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)
本章主要内容: 1)函数重载 2)C++调用C代码 3)new/delete关键字实现动态内存分配 4)namespace命名空间 大家都知道,在生活中,动词和不同的名词搭配一起,意义都会大有不同,比 ...
- 【Python】 命名空间与LEGB规则
命名空间与LEGB规则 之前隐隐约约提到过一些关于Python赋值语句的特殊性的问题,这个问题的根源就在于Python中的变量的命名空间机制和之前熟悉的C也好java也好都不太一样. ■ 命名空间 所 ...
- 关于JavaScript的namespace命名空间
写C或者JAVA习惯的人写JavaScript时可能会发现JavaScript并没有命名空间这一概念,当然如果没有接触过命名空间的程序猿(比如写js,PHP,Python)也可能对命名空间不关注或者不 ...
- Python 的命名空间
Python命名空间的本质: 一.命名空间的定义: 二.命名空间的查找顺序: 三.命名空间的生命周期: 四.通过locals()和globals() BIF访问命名空间. 重点是第四部分,我们将在此部 ...
- XML Namespace 命名空间
根据 Namespaces in XML W3C 推荐标准的定义,XML 命名空间 是由国际化资源标识符 (IRI) 标识的 XML 元素和属性集合:该集合通常称作 XML“词汇”. 定义 XML 命 ...
- 第一章 01 namespace 命名空间
一.什么是namespace? namesapce是为了防止名字冲突提供的一种控制方式. 当一个程序需要用到很多的库文件的时候,名字冲突有时无法避免.之前的解决思路是使用更长的变量名字,使用不方便. ...
随机推荐
- uni app canvas 不生效
canvas 创建canvas绘图上下文. <canvas style="width: 300px; height: 200px;" canvas-id="firs ...
- python递归(函数)
递归:一个过程或函数调用自身的一种方法. 1. 效果图 2. 代码 def factorial(n): ''' 该函数用来求任意数的阶乘 参数: n 要求阶乘的数字 ''' # 基线条件 判断n是否为 ...
- Greedy Gift Givers 贪婪的送礼者 USACO 模拟
1002: 1.1.2 Greedy Gift Givers 贪婪的送礼者 时间限制: 1 Sec 内存限制: 128 MB提交: 9 解决: 9[提交] [状态] [讨论版] [命题人:外部导入 ...
- ubuntu系统搭建(jdk1.8+mysql5.7.28+Hadoop2.7.7+hive3.1.2)
一不小心电脑没电关机之后虚拟机就挂了,然后下定决心重新搭一个虚拟机. 以下是几天安装过程的记录以及一些小提示,包括在ubuntu中安装jdk1.8+mysql5.7.28+Hadoop2.7.7+hi ...
- Activiti服务任务(serviceTask)
Activiti服务任务(serviceTask) 作者:Jesai 都有一段沉默的时间,等待厚积薄发 应用场景: 当客户有这么一个需求:下一个任务我需要自动执行一些操作,并且这个节点不需要任何的人工 ...
- python StringIO和ByteIO
一.StringIO 1.作用:在内存在读写str # 导入模块 from io import StringIO # 实例化StringIO对象 str_io = StringIO() # 向内存中写 ...
- 「 深入浅出 」java集合Collection和Map
本系列文章主要对java集合的框架进行一个深入浅出的介绍,使大家对java集合有个深入的理解. 本篇文章主要具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set ...
- pta 6-7 统计某类完全平方数 (20分)
6-7 统计某类完全平方数 (20分) 本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144.676等. 函数接口定义: int IsTheNumber ...
- 夜晚 暴力 十点钟 jQuery 的 extend 实现 原理
jQuery 的 extend 是怎么实现的 一看代码 喉咙 就不爽 这是 jQuery JavaScript Library v1.6 一看代码 多的 屁股疼 , 排名 前三 的 文章 可以去参考下 ...
- jemeter察看结果树中文乱码解决办法
在使用jemeter进行接口测试时,在察看结果树查看接口返回结果时,中文全部显示乱码,这个问题的解决方式如下: 在jemeter的安装路径下面,找到bin目录下, 在bin目录下面找到这个文件:jme ...