Python函数中的作用域规则详解

Python函数中的作用域规则详解

目录

1、简单介绍一下闭包

2、在Python中,并不是任何代码块都能引入新的作用域

3、在Python中,名字绑定在所属作用域中引入新的变量,同时绑定到一个对象。

总结

Python是静态作用域语言,但是它自身是一个动态语言。在Python中变量的作用域是由变量在代码中的位置决定的,与C语言有些相似,但不是完全一样。

在Python 2.0及之前的版本中,Python只支持3种作用域,即局部作用域,全局作用域,内置作用域;在Python
2.2中,Python正式引入了一种新的作用域 — 嵌套作用域;嵌套作用域的引入,本质上为Python实现了对闭包的支持。

1、简单介绍一下闭包 def test(): A = 3 B = 4 def stu(): C = 3 return A+B+C return stu stu = test() stu

在上述此代码中stu方法定义在test的内部,内部函数stu即可以使用外部函数test的变量,我们称这种行为叫做闭包。

2、在Python中,并不是任何代码块都能引入新的作用域

Python中不是任何代码块都可以引入新的作用域这与C有很大的不同:

在C中:

#include<stdio.h> int main() { if(2 > 0) { int i = 0; } printf("i = %d", i); return 0; }

在上述代码中,if子句引入了一个局部作用域,变量i就存在于这个局部作用域中,但对外不可见,因此,接下来在printf函数中对变量i的引用会引发编译错误。

但是,在Python中却并非如此:

if True: i = 0 print i

在上述代码中,if子句并没有引入一个局部作用域,变量i仍然处在全局作用域中,因此,变量i对于接下来的print语句是可见的。

实际上,在Python中,只有模块,类以及函数才会引入新的作用域,其它的代码块是不会引入新的作用域的。

在Python中,使用一个变量之前不必预先声明它,但是在真正使用它之前,它必须已经绑定到某个对象;而名字绑定将在当前作用域中引入新的变量,同时屏蔽外层作用域中的同名变量,不论这个名字绑定发生在当前作用域中的哪个位置。

>>> f() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in f NameError: name 'i' is not defined >>>

运行结果报错

NameError: name ‘i’ is not defined

程序运行时,Python首先在函数f的本地作用域中查找变量i,查找失败,接着在全局作用域和内置作用域中查找变量i,仍然失败,最终抛出NameError异常。

>>> def f(): ... i = 8 ... print(i) ... >>> f() 8 >>> print(i) 0 >>>

运行结果显示

8和0

i = 8是一个名字绑定操作,它在函数f的局部作用域中引入了新的变量i,屏蔽了全局变量i,因此f内部的print语句看到的是局部变量i,f外部的print语句看到的是全局变量i。

>>> i = 0 >>> def f(): ... print(i) ... i = 0 ... >>> f() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in f UnboundLocalError: local variable 'i' referenced before assignment >>>

运行结果报错

UnboundLocalError: local variable ‘i’ referenced before assignment

在上述中,函数f中的变量i是局部变量,但是在print语句使用它的时候,它还未被绑定到任何对象之上,所以抛出异常。

3、在Python中,名字绑定在所属作用域中引入新的变量,同时绑定到一个对象。

名字绑定发生在以下几种情况之下:

参数声明:参数声明在函数的局部作用域中引入新的变量;

赋值操作:对一个变量进行初次赋值会在当前作用域中引入新的变量,后续赋值操作则会重新绑定该变量;

类和函数定义:类和函数定义将类名和函数名作为变量引入当前作用域,类体和函数体将形成另外一个作用域;

import语句:import语句在当前作用域中引入新的变量,一般是在全局作用域;

for语句:for语句在当前作用域中引入新的变量(循环变量);

except语句:except语句在当前作用域中引入新的变量(异常对象);

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注易知道(ezd.cc)的更多内容!  

推荐阅读

    excel怎么用乘法函数

    excel怎么用乘法函数,乘法,函数,哪个,excel乘法函数怎么用?1、首先用鼠标选中要计算的单元格。2、然后选中单元格后点击左上方工具栏的fx公

    excel中乘法函数是什么?

    excel中乘法函数是什么?,乘法,函数,什么,打开表格,在C1单元格中输入“=A1*B1”乘法公式。以此类推到多个单元。1、A1*B1=C1的Excel乘法公式

    标准差excel用什么函数?

    标准差excel用什么函数?,函数,标准,什么,在数据单元格的下方输入l标准差公式函数公式“=STDEVPA(C2:C6)”。按下回车,求出标准公差值。详细

    探探语言设置|探探怎么设置语言

    探探语言设置|探探怎么设置语言,,1. 探探怎么设置语言打开探探软件,然后就有消息提示的红点,点开就行了!其实这些软件都是挺简单的操作的,都是

    excel常用函数都有哪些?

    excel常用函数都有哪些?,函数,哪些,常用,1、SUM函数:SUM函数的作用是求和。函数公式为=sum()例如:统计一个单元格区域:=sum(A1:A10)  统计多个

    git设置编码|git语言设置

    git设置编码|git语言设置,,git设置编码点击cap4j搜索从git直接链接上拉代码。git语言设置Git是一个开源的分布式版本控制系统,可以有效、高

    区域语言设置|区域语言设置工具

    区域语言设置|区域语言设置工具,,区域语言设置工具你好,大致的方法如下,可以参考:1、按下键盘的windows 图标,再开始菜单中单击“设置”;出现的