Python命名空间和作用域窥探.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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 for certain “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???????

文档评论(0)

panguoxiang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档