打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python中的闭包到底有什么用

1、global关键字的作用

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

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

 

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

 

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

 

 

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

 

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

 

 

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

2、函数局部作用域

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

 

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

 

 

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

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

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

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

 

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

 

 

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

 

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

 

 

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

 

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

 

 

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

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

4、nonlocal关键字的作用

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python语法基础
Python函数式编程
Python全局变量和局部变量使用从入门到精通
Python中变量的作用域详解
Python中的变量作用域总结
第22天:Python NameSpace & Scope
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服