Python中的闭包(closure)

closure就是闭包,在一个函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。简单的说,就是某个内部函数被当做对象返回时,夹带了这个内部函数之外的变量,这就形成了一个闭包。

闭包的内部函数中使用的变量一般来自外层函数的传参,外层函数返回内部函数的函数名。

下面我们通过几个例子详细说明一下closure的用法:

首先来个简单的例子了解下闭包的写法:

在这里插入图片描述

我们来看一下输出:
在这里插入图片描述

基本的执行步骤符合我们的预期,闭包中的函数调用和普通的函数是不一样的,内层函数往往是在你调用赋值的新变量,新变量添加括号即可调用内层函数,而不是在执行外层函数的同时调用的。然后就是在书写嵌套函数的时候,外层还是的返回值一定是内存函数的函数名,这才能被称作闭包,当然,内层函数也必须使用外层函数的形参或者是局部变量。

下面我们通过一个for循环的例子更加深入了解闭包:

以下这个函数的本意是打印11,22,3*3的结果,但函数执行过程中忽略了闭包的执行顺序,导致执行结果不如我们所想的:
在这里插入图片描述

我们来看一下打印的结果:
在这里插入图片描述

可以看到在执行内层函数的时候,i的值全部都是3,这样就造成了结果为9,9,9.这是由于闭包执行的时候,并不马上执行内存函数,而是在调用变量名+()的时候才去调用内存函数,而这个时候,for循环已经结束了循环,i已经全为了3,所以会出现结果9,9,9;

那么如何编写代码才可以改变这个结果呢?
在这里插入图片描述

我们可以通过在第一层函数内再创建一个闭包,通过第一层的函数给这个闭包传递参数的方法来调用,这样的话,闭包每次执行的参数都通过I,j进行了存储,当我们通过变量名调用闭包的时候就可以访问正常的1,2,3,因为这些变量都在内存中进行了存储。

下面我们一起看一下打印的结果:
在这里插入图片描述

关于闭包的更深入的理解:

我们通过一个例子说明:
在这里插入图片描述

我们可以看到,我们没有调用过变量名+()来调用内层的函数,但是printer内已经通过__closure__的属性定义了一个元组用于存放所有的cell对象,每个cell对象一一保存了这个闭包中所有的外部变量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值