python闭包到底有什么作用

原创 2018年04月16日 19:45:50

1、global关键字的作用

如果在函数中需要修改全局变量,则需要使用该关键字,具体参见下面例子。

variable=100
def function():
print(variable) #在函数内不对全局变量修改,直接访问是没问题的,不会报错
function() #输出100



variable=100
def function():
result=variable+111
print(result) #在函数内不对全局变量修改,直接使用是没问题的,不会报错
function() #输出211


variable=100
def function():
variable+=111
print(variable) #显示local variable 'variable' referenced before assignment。
#即在函数局部作用域中直接改变全局变量的值会报错
function()


variable=100
def function():
variable=1000 #此时修改variable变量的值不会报错,因为已经在函数局部作用域内重新定义variable,会覆盖全局variable。
variable+=111
print(variable)
function() #输出1111
print(variable) #输出100,虽然函数内部重新覆盖了variable,但是全局variable并未变,依然还是100


那如果不再函数内部重新为全局变量赋值,又想改变全局变量的值,应该怎么做呢?这就要使用global关键字了,如下。

variable=100
def function():
global variable #使用global关键字,表明variable是全局的,此时就可以了直接在函数局部作用域内改变variable的值了
variable+=111
print(variable) #输出211
function()
print(variable) #输出211,这和上面的不一样了,发现全局变量variable本身也改变了

总结:global的作用就是在“函数局部作用域”内声明表示一个全局变量,从而可以在函数内部修改全局变量的值(否则只能访问不能修改),而且函数内部改变的全局变量的值也会改变。

2、函数局部作用域

函数的局部作用域是不能够保存信息的,即在函数内部声明变量在函数调用结束之后函数里面保存的信息就被销毁了,包括函数的参数,如下。

def fun(step):
num=1
num+=step
print(num)

i=1
while(i<5):
fun(3) #连续调用函数4次,每次输出的值都是4,即3+1,这说明每次调用fun函数之后,函数内部定义局部变量num就被销毁了,
#没有保存下来,说明函数的局部作用域被销毁了。那如果要保存函数的局部变量,怎么办呢?引入“闭包”。
i+=1


3、闭包——装饰器的本质也是闭包

“闭包”的本质就是函数的嵌套定义,即在函数内部再定义函数,如下所示。

“闭包”有两种不同的方式,第一种是在函数内部就“直接调用了”;第二种是“返回一个函数名称”。

(1)第一种形式——直接调用

def Maker(name):
num=100
def func1(weight,height,age):
weight+=1
height+=1
age+=1
print(name,weight,height,age)
func1(100,200,300) #在内部就直接调用“内部函数”
Maker('feifei') #调用外部函数,输出 feifei 101 201 301

(2)第二种形式——返回函数名称

def Maker(name):
num=100
def func1(weight,height,age):
weight+=1
height+=1
age+=1
print(name,weight,height,age)
return func1 #此处不直接调用,而是返回函数名称(Python中一切皆对象)
maker=Maker('feifei') #调用包装器
maker(100,200,300) #调用内部函数


(3)“闭包”的作用——保存函数的状态信息,使函数的局部变量信息依然可以保存下来,如下。

ef Maker(step): #包装器
num=1
def fun1(): #内部函数
nonlocal num #nonlocal关键字的作用和前面的local是一样的,如果不使用该关键字,则不能再内部函数改变“外部变量”的值
num=num+step #改变外部变量的值(如果只是访问外部变量,则不需要适用nonlocal)
print(num)
return fun1
#=====================================#
j=1
func2=Maker(3) #调用外部包装器
while(j<5):
func2() #调用内部函数4次 输出的结果是 4、7、10、13
j+=1

从上面的例子可以看出,外部装饰器函数的局部变量num=1、以及调用装饰器Maker(3)时候传入的参数step=3都被记忆了下来,所以才有1+3=4、4+3=7、7+3=10、10+3=13.

从这里可以看出,Maker函数虽然调用了,但是它的局部变量信息却被保存了下来,这就是“闭包”的最大的作用——保存局部信息不被销毁。

4、nonlocal关键字的作用

该关键字的作用和local的作用类似,就是让“内部函数”可以修改“外部函数(装饰器)”的局部变量值。详细信息这里不做讨论。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27825451/article/details/79964128

理解JavaScript中的闭包

本课程介绍什么是闭包,闭包有哪些使用场景,常见的使用错误。
  • 2015年05月10日 18:24

关于Python闭包的理解

闭包 专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,...
  • windows_2015
  • windows_2015
  • 2016-12-14 22:15:01
  • 236

Python 中的闭包总结

前几天又有人在我的这篇文章 python项目练习一:即时标记 下留言,关于其中一个闭包和re.sub的使用不太清楚。我在自己的博客上搜索了下,发现没有写过闭包相关的东西,所以决定总结一下,完善博客上P...
  • CSDNedu
  • CSDNedu
  • 2016-10-21 11:39:51
  • 1571

Python闭包需要注意的问题

定义      python中的闭包从表现形式上定义为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure),也就是说内层函数引用了外...
  • shuaijiasanshao
  • shuaijiasanshao
  • 2016-05-23 08:11:18
  • 1394

记python中的闭包应用

今天我们来看一下函数的闭包(closure)。python中学到高级语法,闭包是逃不开的话题,无论是高阶函数还是装饰器等,不理解闭包会寸步难行。     来看代码 def count(): ...
  • Rubik_Wong
  • Rubik_Wong
  • 2016-12-15 21:29:52
  • 562

【Python】闭包中一个不易察觉的陷阱

Python语言是支持函数式编程的,我们可以在一个函数的函数体中定义另一个完整的函数,甚至返回这个函数.在函数内部定义的函数和外部定义的函数是相同的,唯一的区别就是在函数内部定义的函数是不能被外部访问...
  • lchad
  • lchad
  • 2015-02-27 15:52:55
  • 4279

python闭包到底有什么作用

1、global关键字的作用如果在函数中需要修改全局变量,则需要使用该关键字,具体参见下面例子。variable=100def function(): print(variable) #在函...
  • qq_27825451
  • qq_27825451
  • 2018-04-16 19:45:50
  • 60

Python:闭包

1,使用闭包def countdown(n): def next(): nonlocal n r=n n-=1 return ...
  • moxiang001
  • moxiang001
  • 2018-02-24 09:23:15
  • 23

Python 闭包

Python 闭包函数对象函数在 Python 中是第一类对象,即函数可以作为一个变量的值以及另一个函数的参数或返回值。除此之外,函数还可以嵌套定义。把函数当作数据处理时,它将显式地携带与定义该函数的...
  • yongyuandeie
  • yongyuandeie
  • 2016-01-22 13:34:57
  • 336

Python:闭包的理解

很多函数型的语言都有闭包这一
  • jearbilove
  • jearbilove
  • 2014-09-02 15:25:51
  • 831
收藏助手
不良信息举报
您举报文章:python闭包到底有什么作用
举报原因:
原因补充:

(最多只允许输入30个字)