十闭包

Posted tester-chenmo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十闭包相关的知识,希望对你有一定的参考价值。

1、内函数和外函数

在一个函数内部定义了另一个函数,外部的函数为外函数,内部的函数为内函数

2、闭包

在外函数中定义了一个内函数,内函数中使用了外函数的变量,且外函数的返回值是内函数的引用。这样构成了一个闭包。

  • 一般,如果函数结束,那么函数中所有东西都会释放掉,但闭包是一种特殊情况,如果外函数在结束时发现自己的临时变量会在内部函数中使用,就把这个临时变量绑定给内部函数,然后自己结束

技术图片

 

 

技术图片

 

 

(1)外函数返回内函数的引用:

Python中一切都是对象,函数也是对象

  • a = 1,实际发生的是,在内存中开辟一块内存存放 1 ,然后用 a 这个变量指向这块内存,a 中存储的是 存放 1 这块内存地址的引用;
  • 同理,在执行def demo()时,内存中开辟一些空间存储函数代码,然后将内存地址赋给变量demo。

对闭包,在函数outer中return inner ,在执行demo = outer()时,outer返回inner,inner是一个函数的引用,这个引用被存入demo中,所以在执行demo()时,相当于执行了inner函数。

对函数来说,函数名后不跟括号,表明只是这个函数位置的引用

(2)外函数把临时变量绑定给内函数

  • 按照闭包的特殊情况,外函数在结束时因为临时变量会在内函数中使用,所以在结束返回并内函数的同时把临时变量和内函数绑定在一起。所以在调用内函数时仍能使用外函数的临时变量。
  • 从上图例子中可以看到,内函数能识别外函数不同的临时变量。因为在Python一切都是对象,虽然函数只定义一次,但外函数运行时,实际是按照函数代码执行的,每次调用外函数时都会创建一个内函数。虽然代码一样却创建了不同的对象,并把每次传入临时变量给内函数,在返回内函数的引用

技术图片

 

3、在闭包中修改外函数的局部变量

(1)在基本的Python语法中,函数可以随意读取全局数据,但要修改全局数据有两种方式:

  • 使用global 声明;
  • 当全局变量是可变类型;

 (2)闭包类似。在内函数中修改闭包变量(即外函数绑定给内函数的临时变量)时,在Python3中可以使用nonlocal 声明一个变量,表明这个变量不是本变量空间的局部变量,需要向上一层变量空间查找;

技术图片

 

 技术图片

 

 4、闭包变量只有一份

使用闭包时,一旦外函数被调用返回一次内函数的引用,虽然每次调用内函数时开启一个函数执行过后的消亡,但闭包变量只有一份,每次开启内函数都在使用同一份闭包变量

 技术图片

 

以上是关于十闭包的主要内容,如果未能解决你的问题,请参考以下文章

十匿名函数和闭包

python学习第三十二天函数的闭包

测开之路十一:作用域闭包和修饰器

爱创课堂每日一题第三十五天- 说说你对闭包的理解?

python学习第十二天:闭包函数与装饰器

十闭包函数函数对象装饰器