Python 作用域归纳总结

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、作用域归纳:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180227A1BBQK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券