第17章 作用域
(读者:
Python作用域:变量定义以及查找的地方。
参数传递:传递给函数作为其输入对象的方式。
在代码中的何处给一个名字赋值,对于确定这个名字的含义很关键。
)
Python作用域基础
(读者:
Python创建、改变或查找变量名都是在所谓的命名空间(一个保存变量名的地方)中进行的。
在代码中变量名被赋值的位置决定了这个变量名能被访问到的范围。
Python将一个变量名被赋值的地点关联为(绑定给)一个特定的命名空间。
在代码中给一个变量赋值的地方决定了这个变量将存在于哪个命名空间,也就是它可见的范围。
)
一个变量的作用域(它所使用的地方)总是由在代码中被赋值的地方所决定,并且与函数调用完全没有关系。
作用域法则
(读者:
- 赋值的变量名除非声明为全局变量或非本地变量,否则均为本地变量。如果需要给一个在函数内部却位于模块文件顶层 的变量名 赋值,需要在函数内部通过global语句声明。如果需要给位于一个嵌套的def中的名称赋值,从Python3.0开始可以通过在一条nonlocal语句中声明它来做到。
原处改变对象并不会 把变量划分为本地变量,实际上只有对变量名赋值才可以。例如,如果变量名L在模块的顶层被赋值为一个列表,在函数内部的像L.append(X)这样的语句并不会将L划分为本地变量,而L = X却可以。通常:记住名称和对象之间的清楚的区分是有帮助的:修改一个对象并不是对一个名称赋值。
)
变量名解析:LEGB原则
(读者:
三条简单的原则。对于一个def语句:
- 变量名引用分为三个作用域进行查找:首先是本地,之后是函数内(如果有的话),之后是全局,最后是内置。
- 在默认情况下,变量名赋值会创建或者改变本地变量。
- 全局声明和非本地声明将赋值的变量名映射到模块文件内部的作用域。
)
作用域实例
内置作用域
在Python 2.6中违反通用性
global语句
最小化全局变量
(读者:这就是使用全局变量的问题:不像那些依赖于本地变量的由自包含的函数构成的代码,全局变量使得程序更难理解和使用。)
最小化文件间的修改
其他访问全局变量的方法
(读者:有点复杂,没看懂。)
作用域和嵌套函数
嵌套作用域的细节
嵌套作用域举例
nonlocal语句
nonlocal基础
nonlocal应用
为什么使用nonlocal
本章小结
本章习题
习题解答
参考文献:
1.《Python学习手册》。