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是为了防止名字冲突提供的一种控制方式. 当一个程序需要用到很多的库文件的时候,名字冲突有时无法避免.之前的解决思路是使用更长的变量名字,使用不方便. ...
随机推荐
- 记录一下第一次用markdown写博客回滚过程
前面写博客,一直用的是博客园的TinyMCE编辑器, 今天不知道哪根筋搭牢了,想试试用Markdown写. 于是在“选项”里面把默认编辑器修改为“Markdown”,鉴于本人有一定的Markdown基 ...
- GoCenter助力Golang全速前进
一.背景 Go语言是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言.为了方便搜索和识别,有时会将其称为Golang.自2009年11月Google正式宣布推出,成为开放 ...
- 重拾c++第四天(7):函数相关
1.引用变量: int a; int &b = a; //引用变量 指向同一地址,必须在初始化时定义,且一直对原变量献上忠诚,主要针对类对象 2.函数重载最好用在功能相同,但数据类型不同的情况 ...
- 如何设计一个优雅的RESTFUL的接口
show me the code and talk to me,做的出来更要说的明白 我是布尔bl,你的支持是我分享的动力! 一 .引入 设计接口是我们开发人员的日常操作.当我们把接口交给前端人员时, ...
- 树上对抗搜索 - 树形dp
Alice and Bob are going on a trip. Alice is a lazy girl who wants to minimize the total travelling d ...
- Nginx作为负载均衡服务介绍
GSLB SLB 四层负载均衡 七层负载均衡 四层负载均衡 四层负载均衡工作在OSI模型的传输层,由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源IP.目标IP以外,还 ...
- 系统升级更新,cocoaPods不可用的问题
1.在终端运行: $ sudo gem install cocoa pods 会出现以下错误: ERROR: While executing gem ... (Errno::EPERM) Opera ...
- python 注册登录(文件操作)
name = input("请注册用户:") password = input("请注册密码:") with open(file="user" ...
- python小知识点总结
小知识点总结 1.python2和python3的区别 python2 python3 默认编码 ascii utf-8 input() raw_input() input() print 可以不 ...
- Java入门 - 语言基础 - 09.循环结构
原文地址:http://www.work100.net/training/java-loop.html 更多教程:光束云 - 免费课程 循环结构 序号 文内章节 视频 1 概述 2 while循环 3 ...