Python闭包

前言

学习Python的单例实现的时候,遇到了下面这样的代码。很不理解为什么局部变量 _instance没有重新初始化。后来看到有人说这是闭包,于是又去了解了下

闭包。没想到闭包竟然是编程语言中一个通用的概念,于是深入研究了下。

def singleton(cls):
    _instance = {}

    def inner():
        if cls not in _instance:
            _instance[cls] = cls()
        return _instance[cls]
    return inner

@singleton
class Cls(object):
    def __init__(self):
        pass

cls1 = Cls()
cls2 = Cls()
print(id(cls1) == id(cls2))

闭包(Closure)

闭包是为了在函数是一等公民的编程语言中实现词法作用域的名称绑定的一种机制—翻译自Wiki。估计这么说也没有人能看的懂。先看看一个Python闭包代码:

def f(x):
    def g(y):
        return x + y
    return g  # 整个函数g,和自由变量x组成了闭包

a = f(1) #创建闭包
assert a(5) == 6

bar函数引用外层的foo的变量x,这个x的词法作用域就是bar函数。但是bar中并没有定义变量x,解释器只能向上找外层函数(enclosing function)的x。创建闭包的时候,会给X绑定一个值。这就是定义的由来。可见一个完整的闭包由一个函数和这个函数所处的上下文构成,这个上下文包含了对闭包函数内部自由变量的定义,如图2-1。这个自由变量的生命周期是从创建闭包开始到销毁闭包结束,不同于一般函数局部变量的作用域。f(x) = x + y 中的变量y就是一个自由变量,这个变量的值是多少不是在函数f中给出的。

2-1 闭包

参考

  1. https://zhuanlan.zhihu.com/p/37534850

  2. https://en.wikipedia.org/wiki/Closure_(computer_programming)

  3. https://zhuanlan.zhihu.com/p/37534850

  4. https://goldengrape.github.io/posts/python/Lambda_Tutorials/mian-xiang-yan-ke-yi-sheng-de-lyan-suan-ru-men-jiao-cheng-3/ 很好的lambda演算入门,看完就明白什么是自由变量和绑定变量了

  5. https://en.wikipedia.org/wiki/Free_variables_and_bound_variables

  6. https://en.wikipedia.org/wiki/Name_binding

  7. https://en.wikipedia.org/wiki/Scope_(computer_science)#Lexical_scope 解释了什么是词法作用域

Original: https://www.cnblogs.com/dennis-wong/p/15855420.html
Author: 成蹊0xc000
Title: Python闭包

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582774/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Redis从入门到精通:中级篇

    原文链接:http://www.cnblogs.com/xrq730/p/8944539.html,转载请注明出处,谢谢 本文目录 上一篇文章以认识Redis为主,写了Redis系…

    Linux 2023年5月28日
    0102
  • 做celery异步任务处理,Django中的配置信息没加载,配置的路径环境变量用不了,导致模块频繁导入错误

    做celery异步任务处理,Django中的配置信息没加载,配置的路径环境变量用不了,导致模块频繁导入错误 在设置的异步任务中需要使用到Django配置好的配置信息,比如路径环境变…

    Linux 2023年6月15日
    0136
  • ASP.NET Core 3.0 : 二十四. 配置的Options模式

    上一章有个配置的绑定的例子,可以将配置绑定到一个Theme实例中。也就是在使用对应配置的时候,需要进行一次绑定操作。而Options模式提供了更直接的方式,并且可以通过依赖注入的方…

    Linux 2023年6月7日
    093
  • brew安装与启动redis

    安装 检查是否安装成功 启动 检查是否启动成功 参考 安装 brew install redis 检查是否安装成功 启动 brew services start redis &am…

    Linux 2023年6月6日
    0123
  • 很有创意的AkShell:用JS开发web,轻松发布

    今天看了infoq对作者的采访,感觉很有意思。 我去他们的网站看了下,作者是俄罗斯人,他的目标是最大可能地简化web开发。只需要用浏览器就可以开发 ,点两下鼠标就发布了。 他的哲学…

    Linux 2023年5月28日
    0101
  • MySQL表空间回收的正确姿势

    不知道大家有没有遇到这样的一种情况,线上业务在MySQL表上做增删改查操作,随着时间的推移,表里面的数据越来越多,表数据文件越来越大,数据库占用的空间自然也逐渐增长 为了缩小磁盘上…

    Linux 2023年6月13日
    097
  • 系列文章分类汇总

    尤娜系列 从前,有一个简单的通道系统叫尤娜…… 尤娜系统的第一次飞行中换引擎的架构垂直拆分改造 四种常用的微服务架构拆分方式 尤娜,我去面试了 专业课回顾 …

    Linux 2023年6月14日
    0108
  • Linux之NFS

    一、什么是NFS 共享存储,文件服务器 1.1 基本概述 NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共…

    Linux 2023年5月27日
    083
  • Springboot Mybatis 集成 Redis

    添加 Redis 依赖 $xslt</p> <p>org.springframework.boot spring-boot-starter-data-red…

    Linux 2023年5月28日
    097
  • JAVA设计模式-单例模式

    JAVA设计模式-单例模式 单例模式 类只能有一个实例,在内存中会创建并且只创建一次对象。所有其他类或者其他需要调用的地方都是用这一个对象,可以防止频繁创建对象,内存占用高。特点:…

    Linux 2023年6月6日
    0104
  • CentOS 压缩解压

    打包:将多个文件合成一个总的文件,这个总的文件通常称为 “归档”。 压缩:将一个大文件通过某些压缩算法变成一个小文件。 1.1、tar 压缩格式: tar …

    Linux 2023年6月8日
    094
  • LeetCode_29. 两数相除Divide Two Integers|商的二进制表示与除数的关系

    Problem description Given two integers: dividend and divisor, return dividend/divisor with…

    Linux 2023年6月13日
    080
  • Linux中touch和mkdir、vi的区别

    touch:创建空白文档,新增文件 mkdir:创建一个目录 vi:同touch一样,都是创建一个空白文档 举个栗子:touch w;此时创建一个w的空白文档;file w 可以查…

    Linux 2023年6月13日
    086
  • alloc_pages的实现浅析

    alloc_pages的使用 struct page *alloc_pages(gft_t gfp, unsigned int order) alloc_pages定义于 inux…

    Linux 2023年6月7日
    0113
  • Docker 打包部署web项目 [Dockerfile方式]

    系统环境 IDE: IDEA 2020.2 Linux: WSL2 Ubuntu 20.04 Docker: 20.10.8 参考资料 博客园: Dockerfile常用指令介绍 …

    Linux 2023年6月14日
    0107
  • git-config 配置多用户环境以及 includeIf用法

    方法一: 直接在 $path文件中添加 &#x7528;&#x6237;&#x540D;和 &#x90AE;&#x7BB1;,如: [use…

    Linux 2023年5月27日
    0135
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球