Last Updated on 2019年10月15日

Python中的闭包是一个比较模糊的概念,不太好理解,我最近的面试中也被问及,在一个单例模式的实现上,我用装饰器实现单例,然后面试官就问到了我对闭包的理解,回答的不太清楚。

所以,回来后,好好的查资料理解了一下闭包的概念。下面我们就一起来试着理解这个概念,这在对Python的不断学习中,也是一个避不开的概念。希望对大家有用。

闭包

首先,闭包并不只是一个python中的概念,在函数式编程语言中基本都有应用。

闭包是引用了自由变量的函数,这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

所以简单的说,就是函数定义中引用了函数外定义的变量,并且该函数可以在其定义环境外被执行,相同的函数实例在执行中此外部定义的变量是共享的。然后此外部定义的变量又是外部函数的内部变量,外部函数返回此定义的内部函数,这样就形成了一个闭包。

看下面示例:

def a():

var = []

def b(para):

var.append(para)

print(var)

return b

s = a()

s(1)

s(2)

# 输出结果:

[1]

[1, 2]

[3]

[3, 4]

如上,可以看到,内部函数b应用了外部变量var,在函数b中修改外部变量var,并打印出来,然后外部函数返回此内部函数。

通过外部函数,生成内部函数实例s,运行s函数,会发现外部变量var的值是可以保存和共享的。但是我们再次生成新的函数实例s2,会发现s2中的var变量和s的是不相关的,此外部变量是跟函数实例相关的。

如此,基本可以得到:

闭包中的引用的自由变量只和具体的闭包有关联,闭包的每个实例引用的自由变量互不干扰。

一个闭包实例对其自由变量的修改会被传递到下一次该闭包实例的调用。

而创建一个闭包,基本也要满足以下几点:

必须有内嵌函数

内嵌函数必须引用外部变量

外部函数必须返回内嵌函数

到此, 你是不是发现这个跟什么很相似,是的,就是装饰器!

Python装饰器就是闭包概念的一种体现。

这也就解释了为什么面试官在看到我用装饰器实现单例的时候,会问我闭包。因为这就是很典型的闭包的,看下面单例模式的装饰器:

from functools import wraps

def Singleton(cls):

instance = {}

@wraps(cls)

def wrapper(*args, **kwargs):

if cls not in instance:

instance[cls] = cls(*args, **kwargs)

return instance[cls]

return wrapper

其中,外部变量instance就是被内部函数wrapper引用,外部函数最后返回内部函数,就是一个典型的闭包。每个被此装饰器装饰后的类,都会有一个独有的instance变量来保存实例,因为闭包中每个实例引用的自由变量instance互不干扰,所以能实现单例模式。

对单例模式不熟悉的,请看:《Python 单例模式》

OK,大致闭包的概念就是如此,理解闭包主要是要理解其中的设计思想,这样才能更好的使用闭包。

有任何问题,欢迎留言

python闭包怎么理解_Python 闭包的理解相关推荐

  1. python什么是闭包的作用域_Python闭包的作用域理解

    什么是闭包 在维基中,闭包的解释是这样的: 在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在, ...

  2. python闭包实现原理_Python 闭包详解

    在函数编程中经常用到闭包.闭包是什么,它是怎么产生的及用来解决什么问题呢.给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个 ...

  3. python闭包修改全局变量_Python 闭包 自由变量

    理解:封闭的东西:保证数据的安全 #平均收盘价 方案一数据是不安全的 l1 = [] def make_average(new_value): l1.append(new_value) total = ...

  4. python闭包的条件_python闭包

    python闭包 闭包的条件 1.闭包函数必须返回一个函数对象 2.闭包函数内部的函数必须引用外部的函数的变量,(一般不能引用全局的变量),里面函数的返回值可有可无 闭包格式 def 外层函数(参数) ...

  5. python闭包怎么理解_Python:闭包的理解

    很多函数型的语言都有闭包这一概念,比如python的兄弟js. 人们刚听到闭包这一概念总会觉得它很晦涩,难以理解.其实不然,主要是他的名字起得太抽象了,让人误以为很难. 下面举一个例子: #codin ...

  6. python闭包修改全局变量_Python 闭包

    外函数和内函数 如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数. 闭包: 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的 ...

  7. python闭包修改全局变量_python闭包探究一二

    复习 python引用变量的顺序: 当前作用域局部变量 -> 外层作用域变量 -> 当前模块中的全局变量 -> python内置变量 global:声明一个全局变量 nonlocal ...

  8. 在python中、对于函数定义代码的理解_python中如何理解装饰器代码?

    长文预警,[最浅显易懂的装饰器讲解] 能不能专业地复制题目?配上代码,问题分段. 我来给提主配上问题的代码. 正式回答: 1:如何理解return一个函数,它与return一个值得用法区别在哪? 敲黑 ...

  9. python列表的加法_Python列表加法理解

    我是Python新手,不能将函数转换为列表理解.理解涉及value函数,其包含类如下:class Card(object): # Lists containing valid candidates f ...

最新文章

  1. python 三分钟入门_Cython 三分钟入门教程
  2. DIV常见任务(上) - 常规任务
  3. ping 不通 华为三层交换机vlan_华为交换机常用的三种vlan划分方法,一文了解清楚vlan...
  4. mysql5.6.28安装教程百度经验_Linux(Ubuntu)下Mysql5.6.28安装配置方法图文教程
  5. android刷新时的圆形动画_【Android】圆形揭露动画
  6. 自己调试接口遇到的错误记录
  7. 淘宝如何保障业务稳定性——诺亚(Noah)自适应流控
  8. 产品迭代的节奏怎样适应需求的变化?
  9. php 连接 sqlserver
  10. CoinFLEX的基本情况以及与Bakkt
  11. java电子书大全 下载
  12. php 网站计数器,PHP开源程序通用网站计数器代码分享
  13. 201671030111 词频统计软件项目报告
  14. Deprecated: Function eregi() is deprecated in ……【解决方法】
  15. 博客整理——软件工程实践总结
  16. 计算机如何执行(运行)程序
  17. 中国科学院微生物研究所微生物资源与大数据中心招聘启事
  18. 【毕业设计】 单片机自动写字机器人设计与实现 - 物联网 嵌入式 stm32
  19. idea一直indexing.........
  20. 同样嗑B站6个月,被室友吊打 35K Offer!

热门文章

  1. 惠普800g1支持什么内存_惠普黑白激光打印机哪种好 惠普黑白激光打印机推荐【图文详解】...
  2. mysql update修改数据_MySQL UPDATE:修改数据(更新数据)
  3. php redis 投票_高可用Redis服务架构分析与搭建
  4. Problem F: 结构体--学生信息排序
  5. 退役前的最后的做题记录upd:2019.04.04
  6. Oracle-Decode()函数和CASE语句的不同
  7. SQL随机生成6位数字
  8. 错误:readline/readline.h:没有那个文件或目录解决方法
  9. 从binlog恢复数据及Mysqlbinlog文件删除
  10. Exchange收件人管理