Python3.2官方文档翻译--作用域和命名空间

简介:

6.2 Python作用域和命名空间

在介绍类之前。首先我想告诉你一些关于python作用域的规则。

类的定义很巧妙地运用了命名空间,你须要知道范围和命名空间的工作原理以能全面了解接下来发生的。 顺便说一下,关于这节讲到的知识对于不论什么优秀的python程序猿很实用。

让我们開始以一些定义開始。

命名空间(namespace)是一个从名称到对象的映射。大多命名空间眼下用Python字典实现的,但那通常不会被注意(除非为了性能),在将来它能够改变。命名空间的样例是:内置名称的set(包括函数如abs()和内置异常名称)。在模块中的全局变量名称;在函数调用时的局部名称。在一定程度上对象的属性赋值形成一个命名空间。掌握命名空间的重要事情是在不同的命名空间绝对没有关系。比如。两个不同的模块都能够不混淆的定义方法maximize。模块的用户必须用模块名称为前缀。 

随便说一下。我习惯上吧每个跟在点号(.)后面的属性都称为属性(attribute)。

比如在表达式z.realReal是对象z的一个属性。严格意义上讲。在模块中引用的名称都是属性的引用:在表达式modname.funcname,modname是一个模块对象和funcnam是它的一个属性。 在这个样例,这恰好是在于模块属性和在模块定义中的全局变量名称之间的一个简单的映射:它们共享相同的命名空间。

属性是可读的或者是可写的。在后一种情况下。同意对属性赋值。假设模块属性是可写的,你能够这么写。modername.the_answer = 42. 可写属性也能够用del语句删除。比如。del modname.the_answer将会从名叫modname模块中移除属性 the_answer

命名空间能够在不同的时间里存在而且有不同的生命周期。

python解释器启动时,包括内置名称的命名空间就会创建。而且从不删除。当模块定义读入时,模块的全局命名空间就会创建。正常来说。模块命名空间一直存在直到解释器退出。

通过解释器的顶层调用运行。从脚本文件里读取或者交互,都觉得是_main_模块的一部分,因此他们也有自己的全局命名空间。(内置名称实际也存在于一个模块。称为builtins.

当函数调用时函数的局部命名空间就会创建,当函数返回值或者抛出在方法中没有处理的异常时,就会删除。当然,每一个递归调用都有自己的局部命名空间。

作用域就是一个python程序能够直接訪问命名空间的正文区域。

这里“直接訪问”的意思就是一个名称的非法引用试图在命名空间中寻找名称。

虽然作用域都是静态定义,可是它们动态使用。

在运行过程中的不论什么时候,至少有给三个关联的命名空间能够直接訪问的作用域:

l 首先被查的是包括局部变量的最内层作用域 

l 不论什么关闭函数的作用域。它们以近期封装的作用域開始进行查询,包括的不是局部变量也不是非全局变量。

l 接着查询包括当前模块全局变量的作用域。

l 最后查询的就是最外面的作用域,它是包括内置方法的命名空间。

假设名称定义为全局的,那么全部的引用和赋值都能够直接给包括模块全局变量的中间作用域。

为了又一次绑定在最内层作用域外面发现的变量,nonlocal语句能够使用。假设未定义为非本地,这边变量仅仅能读取。(读取这样的变量的尝试就会在最内层作用域中产生一个本地局部变量,而外部那个同样标识符的变量不会改变)

通常,局部作用域引用当前函数的局部变量。

函数外面,局部作用域引用引用和全局作用一样的命名空间:模块命名空间。类定义也会在局部作用域中引入还有一个命名空间。

知道作用域能够在文本中定义是很重要的。

在模块中定义函数的全局作用域是那个模块的命名空间,无论函数从哪里或者用何种名称调用。还有一方面,对名称的真正查询是在执行时候动态查询的。可是。语言的定义正在向编译时静态名称确定进化。因此不要依赖动态名称解决。(其实,局部变量已经静态定义了)

 

 Python一个特别之处是--假设没有全局变量有效--名称的赋值经常进入最内层的范围。赋值不会拷贝数据--它们紧紧是把名称绑定在对象上。删除也是一样。Del语句就会移除从局部作用域的命名空间去掉与x的绑定。

其实。介绍新名称的全部操作都用局部变量,特别是,import语句和函数定义在局部局部作用域中绑定模块或者函数名称。

Global语句能够用来描写叙述活动在全局作用域中的特别变量而且应该绑定在那里。Nonlocal语句描写叙述活动在封装作用域中的特别变量并在那里绑定。






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5196281.html,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 Python 数据处理
Python 05 之函数【参数,返回值,嵌套调用,作用域,匿名函数】
Python 05 之函数【参数,返回值,嵌套调用,作用域,匿名函数】
43 0
|
2月前
|
Python
Python系列(5)—— 作用域
Python系列(5)—— 作用域
|
2月前
|
Python
Python新手常见问题三:如何正确理解Python作用域?
在学习Python编程的过程中,理解和掌握作用域(Scope)的概念至关重要。它直接影响到变量的可见性、生命周期以及程序结构的设计。然而,对于许多初学者而言,Python的作用域规则有时可能显得有些神秘和复杂。本文将深入剖析Python作用域的基本原理,并通过实例讲解如何在实际编程中正确应用。
22 1
|
2月前
|
测试技术 API 数据处理
Python办公自动化:解锁高效工作流程,掌握文档处理的艺术
Python办公自动化:解锁高效工作流程,掌握文档处理的艺术
97 1
|
4月前
|
Python
使用python合并文档
使用python合并文档
40 0
|
6天前
|
语音技术 开发者 Python
python之pyAudioAnalysis:音频特征提取分析文档示例详解
python之pyAudioAnalysis:音频特征提取分析文档示例详解
11 0
|
6天前
|
数据采集 数据挖掘 Python
Python之html2text: 将HTML转换为Markdown 文档示例详解
Python之html2text: 将HTML转换为Markdown 文档示例详解
6 0
|
19天前
|
Python
Day4作用域,Python关键字global和nonlocal使用
作用域,Python关键字global和nonlocal使用
4 0
|
27天前
|
Python
Python中的f-string记录表达式:调试文档与实践指南
【4月更文挑战第17天】Python 3.8 引入了f-string记录表达式,允许在格式化字符串时执行赋值操作。这在文档字符串和调试时尤其有用。基本语法是 `f"{variable = expression}"`。示例包括在函数文档字符串中展示变量值和在调试输出中记录变量状态。注意性能和可读性,以及赋值顺序。f-string记录表达式提升了代码效率和维护性,成为Python开发的实用工具。
|
28天前
05-python之函数-函数的定义/函数的参数/函数返回值/函数说明文档/函数的嵌套使用/函数变量的作用域
05-python之函数-函数的定义/函数的参数/函数返回值/函数说明文档/函数的嵌套使用/函数变量的作用域