Python3.2官方文档翻译--作用域和命名空间
6.2 Python作用域和命名空间
在介绍类之前。首先我想告诉你一些关于python作用域的规则。
类的定义很巧妙地运用了命名空间,你须要知道范围和命名空间的工作原理以能全面了解接下来发生的。 顺便说一下,关于这节讲到的知识对于不论什么优秀的python程序猿很实用。
让我们開始以一些定义開始。
命名空间(namespace)是一个从名称到对象的映射。大多命名空间眼下用Python字典实现的,但那通常不会被注意(除非为了性能),在将来它能够改变。命名空间的样例是:内置名称的set(包括函数如abs()和内置异常名称)。在模块中的全局变量名称;在函数调用时的局部名称。在一定程度上对象的属性赋值形成一个命名空间。掌握命名空间的重要事情是在不同的命名空间绝对没有关系。比如。两个不同的模块都能够不混淆的定义方法maximize。模块的用户必须用模块名称为前缀。
随便说一下。我习惯上吧每个跟在点号(.)后面的属性都称为属性(attribute)。
比如在表达式z.real。Real是对象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语句描写叙述活动在封装作用域中的特别变量并在那里绑定。
Python3.2官方文档翻译--作用域和命名空间的更多相关文章
- Python3.2官方文档翻译--作用域和命名空间实例
6.2.1 作用域和命名空间实例 以下的实例主要用来示范怎样引用不同的作用域和命名空间,keywordglobal和nonlocalru怎样影响变量绑定. 实例执行结果是: After local a ...
- Python3.2官方文档翻译--继承
6.5 继承 当然,一门语言特性假设不支持继承那么名称类就失去了价值.子类继承父类的方法例如以下: class DerivedClassName(BaseClassName): <stateme ...
- Python3.2官方文档翻译--实例对象和方法对象
6.3.3 实例对象 如今我们用实例对象做什么呢?实例对象唯一可用的操作就是属性引用.如今有两种合法的属性名称:数据属性和方法. 数据属性相当于smallTalk中的实例变量,C++中的数据成员.数据 ...
- Python3.2官方文档翻译--标准库概览(一)
7.1 操作系统接口 Os模块提供主要很多与操作系统交互的函数. >>> import os >>> os.getcwd() # Return the curren ...
- Python3.2官方文档翻译--迭代器
6.9 迭代器 到眼下为止.你可能已注意到很多容器对象都能够用for语句进行循环: 这样的訪问风格清楚简洁方便. 迭代器的应用是python遍历统一.在这样的场景背后.for语句调用容器对象iter( ...
- Python3.2官方文档翻译--输出格式化
第八章 标准库二 第二部分涵盖了很多更能满足专业开发者需求的高级模块.这些模块在小脚本中非常少出现. 8.1 输出格式化 Reprlib模块为大型的或深度嵌套的容器缩写显示提供了repr()函数的一个 ...
- Spring官方文档翻译(1~6章)
Spring官方文档翻译(1~6章) 转载至 http://blog.csdn.net/tangtong1/article/details/51326887 Spring官方文档.参考中文文档 一.S ...
- Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)(二)
Flume官方文档翻译--Flume 1.7.0 User Guide (unreleased version)(一) Logging raw data(记录原始数据) Logging the raw ...
- 详解Python的作用域和命名空间
最近在学习Python,不得不说,Python真的是一门很好用的语言.但是学习的过程中关于变量作用域(scope)的命名空间(namespace)的问题真的把我给搞懵了.在查阅了相关资料之后,觉得自己 ...
随机推荐
- Art of Unit Test (1) - Breaking Dependency
#!/usr/bin/env python # encoding: utf-8 import unittest """ the simplyest way to test ...
- windows下python2和python3共存
相信很多朋友都在网上搜索过python多版本共存的问题. 多说的说法都是修改python.exe的名字为python2.exe或者python3.exe. 但是我按照这样的方法却总是不成功. 修改py ...
- Python的编码规范(PEP 8 & Google Python guide)
PEP 8 Python 代码规范整理 click here Goole Python 风格指南 中文版 click here 大家有取舍的看吧. 因为文章不是原创的,所以只贴地址,给大家造成麻烦了, ...
- C语言如何定义结构体
原文地址 1. struct与typedef struct区别 struct是结构体的关键字,用来声明结构体变量如 struct student { char num[10]; ch ...
- 走进C标准库(5)——"stdio.h"中的其他部分函数
函数介绍来自:http://ganquan.info/standard-c/ 函数名: freopen 功 能: 替换一个流 用 法: FILE *freopen(char *filename, ...
- 扩展C++ string类
在实际开发过程中,C++string类使用起来有很多不方便的地方,笔者根据根据这些不足简单的扩展了这个类,如增加与数字之间的相互转化和格式化字符串.不足的地方望指正.读者也可以根据自己需求继续扩展. ...
- Windows Server 2012 R2超级虚拟化之六 Hyper-v Replica 2.0和Live migrations
Windows Server 2012 R2超级虚拟化之六 Hyper-v Replica 2.0和Live migrations 分钟复制选项也是非常有用的.Hyper-V Replica 2.0在 ...
- Redis的持久化选项
Redis提供了两种不同的持久化方法来将数据存储到硬盘里面.一种方法叫快照(snapshotting),它可以将存在于某一时刻的所有数据都写入硬盘里面.另一种方法叫只追加文件(append-only ...
- 解决.net中截取字符串的汉字与数字还有静态扩展方法
转载 http://blog.163.com/cn_dreamgo/blog/static/52679452200961033212407/ 这两天在C#编程中应用到C#代码与C的代码信息交互,但 ...
- oracle 11g常用命令
1.监听启动监听lsnrctl start停止监听 lsnrctl stop 查看监听状态 lsnrctl status 2.启动用oracle用户进入su - oracle运行sqlplus命令,进 ...