首页 > 代码库 > Python变量作用域(一)
Python变量作用域(一)
在一个程序中使用变量名时,Python创建、改变或者查找变量名都是在所谓的命名空间中进行的。作用域指的就是命名空间。
Python中的变量名在第一次赋值时已经创建,并且必须经过赋值后才能够使用。由于变量名最初没有声明,Python将一个变量名
被赋值的地点关联为一个特定的命名空间。也即是说,在代码中给一个变量赋值的地方决定了这个变量将存在于哪个命名空间,也
就是它可见的范围。
函数除了打包代码之外,还为程序增加了一个额外的命名空间曾:在默认的情况下,一个函数的所有变量名都是与函数的命名空间
相关联的。这意味着:1、一个在def内定义的变量名能够被def内的代码使用。不能在函数的外部引用这样的变量名。
2、def之中的变量名与def之外的变量名并不冲突,即使是使用在别处的相同的变量名。一个在def之外被赋值的变量X与在这个def
之中的赋值的变量X是完全不同的变量。
函数定义了本地作用域,而模块定义的是全局作用域。这两个作用域有如下的关系:
1、内嵌的模块是全局作用域。每个模块都是一个全局作用域。对于外部的全局变量就成为一个模块对象的属性,但是在一个模块中能够
像简单的变量一样使用。
2、全局作用域的作用范围仅限于单个文件。这里的全局指的是在一个文件的顶层的变量名仅对于这个文件内部的代码而言是全局的。
3、每次对函数的调用都创建了一个新的本地作用域。即是说,将会存在由那个函数创建的变量的命名空间。可以认为每一个def语句都定
义了一个新的本地作用域,但是因为Python允许函数在循环中调用自身,所以从技术上讲,本地作用域实际上对应的是函数的调用。换句话
说,每一个函数调用都创建了一个新的本地命名空间。递归在处理不能提前预知的流程结构时是一个有用工具。
4、赋值的变量名除非声明为全局变量或非本地变量,否则均为本地变量。
5、所有其他的变量名都可以归纳为本地、全局或者内置的。
变量名解析遵循的原则:LEGB原则
1、当在函数中使用未认证的变量名时,Python搜索4个作用域【本地作用域(L),之后是上一层结构中def或lambda的本地作用域(E),
之后是全局作用域(G)、最后是内置作用域(B)】并且在第一处能够找到这个变量名的地方停下来。如果没有搜索到变量名,Python会报错。
2、当在函数中给一个变量名赋值时,Python总是创建或改变本地作用域的变量名,除非它已经在哪个函数中声明为全局变量。
3、当在函数之外给一个变量名赋值时,本地作用域与全局作用域是相同的。
全局变量的总结:
1、全局变量是位于模块内部的顶层的变量名
2、全局变量如果是在函数内部赋值的话,必须经过声明
3、全局变量在函数内部不经过声明也可以使用
根据要求的对象,工厂函数有时候也称作闭合,即一个能够记住嵌套作用域的变量值的函数,即使那个作用域已经不存在了。工厂函数有时用于需要
及时生成事件处理,实时对不同情况进行反馈的程序中。例如:
1 def maker(N): 2 def action(X): 3 return X**N 4 return action 5 6 7 f = maker(2) 8 f(3) 9 运行结果:9 10 f(4) 11 运行结果:16 12 13 f = maker(3) 14 f(3) 15 运行结果:27 16 f(4): 17 运行结果:64
Python变量作用域(一)