Python Scopes and Namespaces

python的域和命名空间

       最近在学习python,对于官方文档中的作用域和命名空间读了好多遍才看懂,所以决定翻译过来,加深理解。

       在介绍类以前,我首先必须告诉你一些python中域的规则。类的定义对命名空间玩弄了一些小技巧,为了全面了解所发生的事情,你必须了解作用域域命名空间的工作方式。顺便说一句,这个主题对于任何高级python程序员很有用。

       让我们从一些概念开始。

       命名空间是从名称到对象的映射,目前大多数命名空间通过python中的字典实现,但是通常情况下这一点不需要关注(除了性能),这一点在以后也许会改变。命名空间的例子:内置名字的集合(包括像abs()这样的函数,以及内置异常的名字);模块中的全局名字;和函数调用中的局部名字。有一种情况,对象的属性也会形成一个命名空间,关于命名空间有一个重要的事情需要知道,不同命名空间中的名字没有任何联系;例如,两个不同的模块也许都定义函数maximize而不会混淆——模块使用者必须以模块名字作为前缀。

      顺便说一句,我把一个点号后面的任何名字都称为属性——例如,在表达式z.real,中real是对象z的一个属性。严格讲,对模型中名字的引用是对属性的引用:在表达式modname.funcname中,modname是一个模块对象,funcname是他的一个属性。这种情况下,碰巧在模块属性和模块中定义的全局名字有直接的映射:他们共享相同的命名空间。

属性也许是只读的或者是可写的,在后一种情况下中,对属性的赋值是可能的。模块属性是可写的:你可以写modname.the_answer=42.可写的属性也可以用del删除。例如del modname.the_answer 会在modname对象中删除the_anwer属性。

      命名空间在不同的时刻创建,有不同的使用期。包含内置名字的命名空间在python解释器打开的时候被创建,从不会被删除。模块的全局命名空间在模块定义被读入的时候创建;通常模块命名空间会持续到解释器退出。从脚本读入或者从交互命令行读入由解释器的顶层调用的语句被认为是称作__main__模块的一部分,因此他们有他们自己的全局命名空间,(内置名字实际上也存在于模块中,这个模块称作builtins.)

      函数的局部命名空间在函数被调用的时候创建,在函数返回或者抛出异常但是并没有处理的时候删除,(实际上忘记是个描述实际发生了什么的较好的方式),当然,递归调用每一次都有他们自己的局部命名空间。

      作用域是python程序的文本区,这里命名空间可以直接被访问,直接访问的意思是说,不受限制的引用名字并尝试在命名空间中找到名字。

      虽然作用域是静态决定的,他们在使用时是动态的,运行时的任何时间,至少三个嵌套的作用域的命名空间可以直接访问。

  • 最内层作用域,首先被搜索,包含局部名字
  • 任何封闭函数作用域,随着最近的封闭作用域开始被搜索,包含non-local但是也是non-global名字
  • the next-to-last作用域包含当前模块的全局名字
  • 最外层作用域,最后被搜索,是包含内置名字的命名空间

      如果一个名字被生命为全局的,然后所有的引用和赋值直接对于包含模块全局名字的中间作用域,为了重新把变量绑定到最内层作用域的外面,可以使用nonlocal语句;如果没有声明nonlocal,这些变量是只读的(写这样一个变量会直接在最内层作用域中创建一个新的局部变量,是相同名字的外层作用域中的名字不改变)。

      通常,局部作用域引用当前函数的局部名字,函数外,局部作用域引用相同的命名空间作为全局作用域:模块的命名空间。类定义也是在局部作用域中的另一个命名空间

      意识到作用域是由原名称决定的是重要的:定义在模块中的函数的全局作用域是模块的命名空间,不管在哪里或者通过任何别名调用函数。另一方面,实际搜索名字是动态的,在运行的时候——然而,语言定义是朝着静态名字解决方案发展的,在“编译”时,因此不要依赖于动态名字解决方法!(事实上,局部变量已经静态决定了)

      python的一个特别的习惯是,如果没有global语句影响——对名字的赋值永远进入最内层作用域,赋值不会赋值数据——仅仅把名字绑定到对象上。对于删除是一样的:语句del x在由局部作用域引用的命名空间中删除对x的绑定。事实上,所有引入新的名字的操作使用局部作用域,import语句和函数定义绑定模块和函数名在局部作用域中。

      global语句可以用于指定特别的变量存活在全局作用域中,应该被重新绑定到全局作用域中,nonlocal语句指定某个变量存活在某个封闭的作用域中,应该被绑定到这里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值