1. 全局变量、局部变量
全局变量、局部变量:
在文件中所有函数外部创建的变量,整个文件可见,称为全局变量。
在函数内部创建的变量只在函数内使用该变量,这个种变量称为局部变量。
注:函数的参数也是局部变量
2. 作用于相关概念
变量的生命周期:
变量从创建到删除(销毁)存在时间称为其生命周期
命名空间:
变量再第一次赋值时被创建,为了能找到这个变量,变量名被保存到一个地方,这个地方可以叫做命名空间。
变量一旦创建,命名空间就确定了(创建位置确定了,命名空间),同一个命名空间变量名唯一。
模块、类、函数都有命名空间。
变量的作用域:
变量能起作用的范围,称为其作用域或者可见范围。
如:函数内的变量只能被函数内的代码访问。
验证执行如下代码输出结果是什么?
图:全局变量和局部变量
所有函数外部定义的变量属于模块内的全局变量,函数内部定义的变量属于局部变量。变量只要在赋值时创建,子函数内部如果没有对变量赋值,就没有创建变量,这种情况下,会向上级查找是否由该名字的变量。
函数的参数也是局部变量,验证下码的代码:
图:函数参数是局部变量
函数内部将x绑定到1000,但是全局变量x与100的绑定关系未变。
使用一个变量,Python首先从局部找起,如果没再从上级空间查找,依次类推,直到全局作用域。
思考与验证如下代码执行结果如何?
3. Python 有四个作用域LEGB
Python有四个作用域:
图:Python4个作用域
局部作用域:Local
包含局部变量,如:函数内,类的方法内
嵌套函数(闭包)作用域 Enclosing
包含了非局部(non-local)也非全局(non-global)的变量。
比如两个嵌套函数,内层函数可能搜索外层函数的命名空间,但外层函数的命名空间对内层函数而言既非局部也非全局。
全局作用域 Global
模块或者程序的所有函数之外,我们自己编写的程序的最高层。
内置作用域 Built-in
Python __builtin__ 模块,包含了内建的变量/关键字等。
如内置变量和函数。
4. Python作用域搜索顺序
Python作用域搜索顺序遵循 LEGB规则 搜,Local -> Enclosing -> Global -> Built-in即:L>E>G>B。当搜索一个变量时现在Local作用域搜索,如果没有则在Enclosing作用域搜索,如果没有则在Global作用域搜索,如果还没有则在Built-in作用域搜索,如果还没找到则报变量未找到。
作用域可以嵌套,如没创建一个对象都有一个作用域,对象中再创建对象。
图:作用域搜索顺序
示例:
图:四个作用域示例
示例2
5. 变量与作用域
Python中所有变量名都是在第一次赋值时创建,作用域也随之确定
变量只有赋值(创建)后才能被引用
一个函数内的所有变量名都是与函数的命名空间关联的
1. 一个 def 内(函数内)定义的变量,只能被函数内的代码使用,不能在函数外部引用这些变量名
2. 一个 def 内定义的变量名与 def 外的同名变量代表不同的变量名,本地优先
3. def 内的代码可以引用def外的变量名(函数内没有对变量赋值的情况下)
def 内的作用域,只有在def内代码执行时才能访问(栈)
6. global语句
声明变量为全局变量
全局变量位于模块文件顶层(全文件可见)
语法:global 变量名1, ...
示例:
测试以下几个函数:
娱乐以下,奇葩写法:
这写法不推荐使用,建议按正常写法,先global 声明,然后使用。这个写法在3.5下报警告,但可以执行。3.6.4下干脆就报语法错误。
Linux环境下3.5执行结果:
图:3.5执行结果
windows下3.6执行结果:
图:3.6下执行结果
7. nonlocal语句(Python 3.0 引入)
声明变量非本地变量(不是局部变量也不是全局变量),必须用在嵌套函数中。
语法
nonlocal 变量1,...
示例
测试验证以下代码:
图:非全局,非局部
图:逐级查找,找到停止
图:逐级查找,找到停止
以上给出了几个nonlocal的例子,可以验证体会nonlocal作用。
nonlocal归纳:
• nonlocal语句用于在嵌套函数中声明变量为非本地变量
• nonlocal必须使用在嵌套的函数中
• nonlocal修饰的变量,在函数上层中函数中查找变量
• nonloca修饰的变量必须在上层函数中已经定义过(赋值过)
• 通常只有在子函数中想修改上层函数的变量时,才使用nonlocal修饰该变量
• 使用nonlocal理论上可以加快变量的搜索速度
• nonlocal语句的变量列表里的变量名,不能出现在此作用域的参数列表中
• 当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近一层的同名变量进行操作
8. global vs nonlocal
global 声明变量为顶层全局变量,可用于任何函数
nonlocal声明变量为嵌套函数中的上层变量(非本地,非全局)
9、作用域归纳:
领取专属 10元无门槛券
私享最新 技术干货