注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云淡风轻

云淡风轻近午天,傍花随柳过前川。

 
 
 

日志

 
 

[zsuxqm] 作用域和名字空间(Python)  

2006-05-24 13:11:25|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
从python的tutorial中翻译的。原来翻译也是很辛苦的,虽然我翻译的只是简单的英文而已。

一个名字空间是指从名字到对象的映射。现在大多数名字空间是像Python的字典那样实现的,不过这不必在意(除非想看性能),将来它的实现也可能会改变。名字空间的例子有:内建名字的集合(像函数abs(),内建异常名字),模块中的全局名字,还有函数调用时的局部名字。在某种意义上,对象的属性集合也形成一个名字空间。关于名字空间,重要的一点是要认识到,不同名字空间中的名字,是完全没有关系的。例如,两个不同的模块可以同时定义一个maximize的函数,这完全不会冲突--模块使用者会在函数名前面加上模块名的。
在这里,我使用属性来表示任何一个在点(.)后面的名字,比如,表达式z.real,real就是对象z的一个属性。严格来说,在模块中对名字的引用就是属性的引用,在表达式modname.funcname,modname是一个模块对象而funcname是它的一个属性。这种情况下,刚好在模块属性和模块中定义的全局名字之间有一个直接映射:它们共享一个相同的名字空间。
属性可能是只读的或可写的。在后一种情况,赋值给属性是可以的。模块属性都是可写的,你可以写"modname.the_answer = 42"。可写属性也可以用del语句来删除,比如,"del modname.the_answer"就会从modname的模块中移除去the_answer属性。
名字空间在不同时候创建,生命期也不同。包含了内建名字的名字空间在Python解释器启动的时候被建立,而且从不被删除。模块的全局名字空间在模块定义被读取的时候创建,通常,模块的名字空间也延续到从解释器退出。通过解释器顶层调用去执行的语句,无论是从脚本文件中读入还是交互,都被认为是一个叫做__main__的模块的一部分,所以他们也有他们自己的全局名字空间。(内建名字实际上也在一个模块中,叫做__buildin__)。
一个函数的局部名字空间,在函数被调用的时候创建。在函数返回或是抛出不在函数中处理的异常的时候被删除。(实际上,忘记,而不是删除,更好的描述了解释器的实际情况)当然,所有递归调用都有它们自己的局部名字空间。

作用域是,在Python程序中,一个名字空间能够被直接访问的上下文环境的区域。“直接操作”,这里意思是:一个没有限制的引用,将找到名字空间中的名字。
尽管作用域是静态确定的,但它们都是动态使用的。除了异常情况,至少有三个内嵌作用域,其名字空间是可以直接访问的,它们是:最内层作用域,它将是首先搜索到的,包括局部名字,嵌套函数的名字空间;中间层作用域,它是其次被搜索到的,包括当前模块的全局名字;最外层作用域,最后搜索到的,是一个包括内建名字的名字空间。

--
Posted by Gecko to zsuxqm at 5/24/2006 10:48:00 AM
  评论这张
 
阅读(127)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017