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)

大家都在看

  • cube.js 即将使用cube store 替换redis

    随着发着cube store 的能力已经很强大了,官方目前计划使用cube store 替换redis cube.js 内存查询参考 官方对于redis 的说明 官方觉得redis…

    Linux 2023年5月28日
    0136
  • 51单片机入门基础介绍

    基本元器件原理及功能 常用元器件 CAP 电容RES 电阻CRYSTAL 晶振7SEG 数码管sounder 蜂鸣器BUTTONLED-BIBY 二极管PN结,P阳极N阴极,电流方…

    Linux 2023年6月7日
    0101
  • [转]EVE-NG 中使用 SecureCRT 合并tab标签

    在EVE-NG中双击设备使用SecureCRT对设备进行调试连接时,会出现每次连接不同设备时都会打开一个新的SecureCRT窗口,而不是在一个窗口中添加一个新的标签页,这就会导致…

    Linux 2023年6月8日
    0101
  • 在线安装Docker

    安装 yum-utils 包yum install -y yum-utils 设置存储库# 官方地址(比较慢) yum-config-manager \ –add-repo \ …

    Linux 2023年6月7日
    091
  • 机器学习:正态方程 python实现

    前言 一、算法介绍 二、核心算法 1. 公式 2.python实现 总结 前言 使用python简单实现机器学习中正态方程算法。 一、算法介绍 与梯度下降算法相比,正态方程同样用于…

    Linux 2023年6月7日
    0103
  • shell中的##*,%%*问题

    假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值:${file#/}:删掉第一个 / 及其左边的字符串…

    Linux 2023年5月28日
    075
  • 聊聊 Netty 那些事儿之 Reactor 在 Netty 中的实现(创建篇)

    本系列Netty源码解析文章基于 4.1.56.Final版本 在上篇文章《聊聊Netty那些事儿之从内核角度看IO模型》中我们花了大量的篇幅来从内核角度详细讲述了五种 IO&am…

    Linux 2023年6月6日
    093
  • 嵌入式软件架构设计-程序分层

    1 前言 在嵌入式MCU软件开发过程中,程序分层设计也是重中之重,关系到整个软件开发过程中的协同开发,降低系统软件的复杂度(复杂问题分解)和依赖关系、同时有利于标准化,便于管理各层…

    Linux 2023年6月7日
    0150
  • 重写并自定义依赖的原生的Bean方法

    转载请注明出处: 在项目开发过程中,往往是直接应用很多jar包中依赖且声明好的Bean,拿来即用,但很多场景也需要对这些原生的Bean 进行自定义,定制化封装,这样在项目使用的过程…

    Linux 2023年6月15日
    0133
  • Linux下如何切割与合并大文件

    我们传输一个大文件时,有时网络比较慢,需要花费很长时间才能传输完成,或者传输的过程中,网络不稳定,有可能导致此次传输失败,针对这种情况,我们可以把大文件切分成小文件,再逐个的传输到…

    Linux 2023年6月13日
    0123
  • 在linux中使用tcpdump抓包的方法:

    在linux中使用tcpdump抓包的方法: 1,运行下面命令来从所有网卡中捕获数据包: tcpdump -i any 2,从指定网卡中捕获数据包 tcpdump -i eth0 …

    Linux 2023年6月14日
    0134
  • 面试题:Java中为什么只有值传递?

    作者:小牛呼噜噜 | https://xiaoniuhululu.com计算机内功、JAVA底层、面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 经典的问题 形参&实参…

    Linux 2023年6月6日
    0138
  • phpcms如何在前台文章列表前显示所属类别名称

    最近做单位网站模版遇到的问题,欲实现的效果: 但是phpcms中自带的文章列表标签没有这个功能,数据库中文章表中也只有类别id的字段,因此不能通过简单的{$r[catname]}读…

    Linux 2023年6月13日
    096
  • 《Redis开发与运维》——(五)Redis持久化(脑图)

    posted @2021-01-09 15:04 雪山上的蒲公英 阅读(122 ) 评论() 编辑 / 返回顶部代码 / Original: https://www.cnblogs…

    Linux 2023年5月28日
    0102
  • Kubernetes 安装Redis集群

    一、Operator 以集群模式安装 可以在service_account和 operator后面加-n 参数指定namespace 这个yaml文件中使用的资源较高,测试环境可能…

    Linux 2023年5月28日
    074
  • 【Linux】【虚拟机】 IP地址的动态与静态设置

    配置文件的修改 配置文件的修改 vim /etc/sysconfig/network-scripts/ifcfg-ens33 IP配置方式(不指定:none,静态:static,动…

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