Python 中的闭包、闭包的同级访问以及闭包保存参数的状态

Python 中的闭包、闭包的同级访问以及闭包保存参数的状态

1、引入闭包
首先,一个问题,我们在函数的外部是无法访问到函数里面的变量 a 的。
在这里插入图片描述
但是我们可以用 return 将这个变量的值返出来,而且必须有一个容器接着。
在这里插入图片描述
在这里,变量 a 和 函数 inner_func 是兄弟关系,同样,我们可以将这个内部函数用 return 扔出来,再用一个容器接着。
在这里插入图片描述
所以,闭包的格式:

1、外部函数中定义了内部函数
2、外部函数是有返回值的
3、返回的值,就是内部函数的名字
4、内部函数引用了外部函数的变量,否则不是完全闭包

2、闭包的同级访问以及闭包保存参数的状态

(1)可以使用同级的作用域,但是不能使用同级里面的变量。比如在 inner_func2里面打印inner_func1里面的变量b,就会报错,但是在 inner_func2里面可以调用inner_func1()
在这里插入图片描述

(2)读取其他元素的内部变量
(3)延长作用域

我们先看一段代码,在调用外部函数,传入2,3之后,没有立刻去调用x(),也就是内部函数,而是再次调用外部函数,传入了4,5,才去调用的内部函数。
在这里插入图片描述
在这里插入图片描述

由结果我们可以看到,闭包能够保存外层函数变量的状态,说的通俗一点,就是当调用func(2,3),return 的内部函数已经记录保存了此时a和b的值,而在最后执行x()时,a和b的值不会被第二次的4和5淹没。
在这里插入图片描述
3、闭包的缺点
(1)作用域没有那么直观
(2)因为变量不会被垃圾回收,所以有一点给的内存占用问题

4、闭包的总结
(1)闭包优化了变量,原来需要类对象完成的工作,闭包也可以完成
(2)由于闭包引入了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
(3)闭包使代码变得简洁,便于代码阅读
(4)闭包是理解装饰器的基础

5、应用:计数器

在这里插入图片描述

这是在执行68行代码,第二次调用内部函数时,发现在经过第一次调用内部函数以后,与内部函数同级的变量 container 发生了变化,由 [0] 变成了 [1] 。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值