- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Python命名空间和作用域窥探
Namespace and Scope(命名空间和作用域)
namespace
Namespace(只)是?从名字到对象的一个映射(a mapping from name to objects)?。大部分namespace都是按Python中的字典来实现的。有一些常见的namespace:built-in中的集合(?abs()?函数等)、一个模块中的全局变量等。
从某种意义上来说,一个对象(object)的所有属性(attribute)也构成了一个namespace。在程序执行期间,可能(其实是肯定)会有多个名空间同时存在。不同namespace的创建/销毁时间也不同。
此外,两个不同namespace中的两个相同名字的变量之间没有任何联系。
scope
有了namespace基础之后,让我们再来看看scope。Scope是Python程序的一块文本区域(textual region)。
在该文本区域中,对namespace是可以直接访问,而不需要通过属性来访问。
Scope是定义程序该如何搜索确切地“名字-对象”的名空间的层级关系。(The “scope” in Python defines the “hirerchy level” in which we search namespaces forcertain “name-to-object” mappings.)
Tip
直接访问:对一个变量名的引用会在所有namespace中查找该变量,而不是通过属性访问。
属性访问:所有名字后加?.?的都认为是属性访问。
如?module_name.func_name?,需要指定?func_name?的名空间,属于属性访问。而?abs(-1)?,?abs?属于直接访问。
两者之间有什么联系呢?
Important
在Python中,scope是由namespace按特定的层级结构组合起来的。
scope一定是namespace,但namespace不一定是scope.
LEGB-rule
在一个Python程序运行中,至少有4个scopes是存在的。
直接访问一个变量可能在这四个namespace中逐一搜索。
? Local(innermost)
包含局部变量。比如一个函数/方法内部。
? Enclosing
包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,内层函数可能搜索外层函数的namespace,但该namespace对内层函数而言既非局部也非全局。?
? Global(next-to-last)
当前脚本的最外层。比如当前模块的全局变量。?
? Built-in(outtermost)
Python?__builtin__?模块。包含了内建的变量/关键字等。?
那么,这么多的作用域,Python是按什么顺序搜索对应作用域的呢?
著名的”LEGB-rule”,即scope的搜索顺序:
Important
Local - Enclosing - Global - Built-in
怎么个意思呢?
当有一个变量在?local?域中找不到时,Python会找上一层的作用域,即?enclosing?域(该域不一定存在)。enclosing?域还找不到的时候,再往上一层,搜索模块内的?global?域。最后,会在?built-in?域中搜索。对于最终没有搜索到时,Python会抛出一个?NameError?异常。
作用域可以嵌套。比如模块导入时。
这也是为什么不推荐使用?from?a_module?import?*?的原因,导入的变量可能被当前模块覆盖。
Assignment rule
看似python作用域到此为止已经很清晰了,让我们再看一段代码:
Python
1
2
3
4
5
6
7
8
9
10
11
def outer():
????a = 0
????b = 1
?
????def inner():
????????print a
????????print b
?
????inner()
?
outer()
你觉得结果是什么呢?So easy是不是?
1
2
3
ciphera href=/members/rachel@Rachel/a ~/Development/Workspace/test_Python $ python2 a.py
0
1
如果多加一句呢?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def outer():
????a = 0
????b = 1
?
????def inner():
????????print a
????????print b
?
????????# b += 1???????
您可能关注的文档
最近下载
- 高考生物临考必背【新教材新高考 生物考前必背核心知识】选必2 生物与环境.docx VIP
- 重庆市社区公共服务设施规划布局与设置标准.pdf VIP
- 尽管去做无压工作中文版.doc
- 2021年7月成都市龙泉驿区(卫生类)招聘考试《护理学》试卷.docx VIP
- 滨江项目CSM水泥土搅拌墙施工方案.pdf VIP
- 国家开放大学汉语言文学本科《古代小说戏曲专题》期末纸质考试第二大题填空题库[2025春期版] .docx VIP
- 湖南省长沙市望城区2024-2025学年八年级下学期物理期末试题.pdf VIP
- 国家开放大学汉语言文学本科《中国现代文学专题》期末纸质考试第二大题填空题库[2025春期版].doc VIP
- 网课知到 语言学概论智慧树答案.docx VIP
- (最新)职业院校教学能力比赛《教学实施报告》模板.docx VIP
原创力文档


文档评论(0)