一文读懂python中的闭包

本文深入浅出地介绍了Python中的闭包,包括闭包的概念、写法、如何修改外函数变量以及注意事项。通过实例展示了闭包如何在函数内部保持对外部变量的引用,以及nonlocal关键字的作用。闭包在装饰器等高级编程中有着广泛应用,是理解Python高级特性的重要一环。
摘要由CSDN通过智能技术生成

【干货满满】

  昨日突然有小伙伴来问我python中的闭包到底是个神马东东,一想到我当初学习闭包时也是稀里糊涂的,所以特意写了一篇文章来讲解python中的闭包到底应该怎么用,希望能给大家带来帮助。


一、闭包的基本理解

在介绍闭包之前,先简单理解下两种函数概念。

外函数:嵌套函数中最外层的函数称之为外函数。

内函数:嵌套函数中最内层的函数称之为内函数。

闭包的特点:

①:闭包是一种特殊的函数,由外函数和内函数嵌套而成;

②:内函数引用了外函数的临时变量;

③:将使用临时变量的内函数作为外函数的返回值。

二、闭包写法介绍

闭包的基本格式如下:

def 外函数(参数a):
	外函数临时变量b = 某值
	def 内函数(参数c):
		print(运算操作)
	return 内函数

res = 外函数(参数a)
res(参数c)

其中:

①:外函数中可传入多个参数,也可不传入参数;

②:外函数中可定义一个或多个临时变量,用于内函数对其引用;

③:内函数可传入多个参数,也可不传入参数;

④:内函数中可对外函数中的参数、临时变量以及内函数中的参数进行相关运算操作;

⑤:然后用一个变量(这里命名为res)接收外函数的返回结果;

⑥:由于外函数的返回的结果为内函数,若直接输出res则会显示对应的内函数内存地址,因此需要写成res(参数c)的形式,才会显示内函数中运算操作的结果。

直接上案例:

def outer(a):
	b = 12
	def inner(c):
		print(a + b + c)
	return inner

res = outer(10)
res(5)

此时,最终输出的结果为27。

  具体流程为外函数接收了参数a = 10,内函数接收了参数c = 5,同时外函数中的临时变量b被内函数引用,在内函数中打印出(a + b + c)的结果,并将内函数作为外函数的返回结果进行返回,最后直接调用外函数,将返回结果赋为res,再调用内函数,返回最终结果27。

三、 闭包中内函数修改外函数临时变量

下面介绍一种常用的修改外函数临时变量的方法:

利用nonlocal关键字声明临时变量

def outer(a):
    b = 12
    def inner(c):
        nonlocal b
        b = 22
        print(a+b+c)
    return inner
res = outer(10)
res(5)

  由于我们在内函数中使用nonlocal关键字声明了临时变量b,并对其重新赋值,所以,此时的计算结果为37。
  注意,用nonlocal关键字声明临时变量后,若对其重新赋值,外函数中该变量也会同时改变。

def outer(a):
    b = 15
    def c():
        print('外:',a,id(a),b,id(b))
    def inner():
        a = 16
        b = 25
        print('内:',a,id(a),b,id(b))
        c()
    return inner
res = outer(10)
res()
#内:16 140706505200928 25 140706505201216
#外:10 140706505200736 15 140706505200896

  可以看出,当我们想对外函数的变量进行重新赋值,却没有用nonlocal在内函数中进行声明时,外函数中若再次引用该变量,其结果和内函数中该变量是不同的,通过变量的id地址就能看出。

def outer(a):
    b = 15
    def c():
        print('外:',a,id(a),b,id(b))
    def inner():
        nonlocal a
        a = 16
        b = 25
        print('内:',a,id(a),b,id(b))
        c()
    return inner
res = outer(10)
res()
#内:16 140706505200928 25 140706505201216
#外:16 140706505200928 15 140706505200896

  当使用nonlocal声明变量并重新赋值后,该变量在内函数与外函数中即为同一个,从变量的id地址即可看出。

四、闭包注意事项

  一般情况下,函数在运行结束后会将临时变量都释放给内存。但是闭包比较特殊,由于内函数中会用到外函数的临时变量,因此它会将外函数的临时变量与内函数捆绑在一起,在外函数运行结束后,使其临时变量会在后续中继续被内函数调用。

  闭包主要用在装饰器中,接下来我将再出一篇python装饰器讲解文章,包含常用装饰器的使用方法和应用案例,欢迎大家评论关注哦。


特此说明

  以上介绍仅是个人对于python闭包的理解,衷心希望能对各位小伙伴有所帮助,如有不妥之处欢迎大家批评指正!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老人与海丨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值