码迷,mamicode.com
首页 > 其他好文 > 详细

十一、闭包

时间:2020-06-13 12:47:11      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:glob   http   inner   style   需要   引用   png   自己   地址   

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、闭包变量只有一份

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

 技术图片

 

十一、闭包

标签:glob   http   inner   style   需要   引用   png   自己   地址   

原文地址:https://www.cnblogs.com/Tester-Chenmo/p/13100170.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!