[Python学习日记-39] 闭包是个什么东西?

news2024/11/24 13:28:48

[Python学习日记-39] 闭包是个什么东西?

简介

闭包现象

闭包意义与作用

简介

        在前面讲函数和作用域的时候应该提到过,当函数运行结束后会由 Python 解释器自带的垃圾回收机制回收函数内作用域已经废弃掉的变量,但是在 Python 当中还有一种现象非常黏黏糊糊,很容易让你搞不清不同作用域之间的界限划分,这就是我们接下来要说的闭包现象。

闭包现象

        关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数,导致最后外部函数的这些局部变量、参数和函数声明本应该随着函数的结束而回收的,但由于内部函数的影响导致其保留了下来。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。单纯用文字说明并不是特别直观,我们直接用代码来看一下,代码如下

def outer():
    name = "Jove"

    def inner():
        print("在 inner 里打印外层函数的变量",name)

    return inner    # 注意这里只是返回了 inner 的内存地址,并未执行

func = outer()    # 返回的是inner的内存地址
func()    # 相当于执行的是 inner()

代码输出如下:

         正常情况下在外部是没有办法执行 inner 的,但是 outer 返回了 inner 的内存地址,所以才可以找到在内存当中的 inner 函数,同时注意此时的 outer 已经执行完毕了,在正常情况下 outer 的内存地址应该已经都释放了才对,但是由于闭包的存在(inner 的内存地址作为返回值返回了,并且 inner 使用了 outer 内的变量),所以本该被释放变量都得以保留,这才让我们可以调用 inner,并且通过 inner 内部调用了上一层 outer 里的 name 变量。而这种黏黏糊糊让人分不清界线的就是闭包现象。

闭包意义与作用

        返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。除此之外闭包还能实现数据隐藏和封装、记忆局部状态、实现函数工厂

  • 实现数据隐藏和封装:闭包将一些数据包裹在函数内部,外部无法直接访问,增加了程序的安全性和可维护性。只有通过特定的闭包函数才能操作这些数据。
  • 记忆局部状态:闭包能够记住外部函数中的局部变量的值,即使外部函数已经执行完毕。这使得闭包可以在不同的时间点保留状态信息,并在后续调用中继续使用。
  • 实现函数工厂:可以根据不同的输入生成不同的函数。通过在外部函数中接收参数,然后在内部函数中使用这些参数,就可以创建一系列功能相似但具有不同参数或状态的函数。

        闭包在 Python 中有着广泛的应用,理解闭包的意义对于写出更加简洁、高效和可维护的代码至关重要,闭包的重头戏还在后面,后面函数进阶学到的装饰器就会用到闭包,所以一定要提前弄清楚闭包的含义,免得到时候看得一脸懵逼。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vulnhub靶场之hackableIII

一.环境搭建 1.靶场描述 Focus on general concepts about CTF Difficulty: Medium This works better with VirtualBox rather than VMware. 2.靶场下载 https://download.vulnhub.com/hackable/hackable3.ova 3.靶场启动 二.信息收集 1.寻找靶场真实的Ip nmap -SP 192.168…

LingedList<T>,自定义泛型

LingedList<T>底层采用双向链表数据结构实现的集合(容器)。 数据结构:是计算机在内存中组织数据的一种方式。 分类: 线性数据结构: 数组:存储同类型数据的大小固定的集合。 列表(List):动态大小的数组,可以灵活的添加,删除元素。 链表(LinkedList):分…

目标检测 DN-DETR(2022)

文章目录 前言gt labels 和gt boxes加噪query的构造attention maskIS&#xff08;InStability&#xff09;指标 前言 gt labels 和gt boxes加噪 query的构造 attention mask IS&#xff08;InStability&#xff09;指标

媒界:家庭出行不用愁 江铃集团新能源易至EV3青春版值得拥有

随着家庭代步、接送孩子上下学的需求进一步释放&#xff0c;纯电小车市场迎来火热发展机遇。江铃集团新能源旗下的易至EV3青春版&#xff0c;以其灵动的车身设计、宽敞的内部空间以及先进的智能配置&#xff0c;成为了家庭用车的优质选择。 作为电动汽车和出行普及者&#xff0…

阿里面试: RocketMQ如何实现每秒上十万QPS的超高吞吐量读取的?

这玩意儿表面看上去挺牛逼&#xff0c;但其实背后的逻辑和套路&#xff0c;在咱们开发里见过的那些招数&#xff0c;都能找到影子。 今天小北和大家一起系统化的梳理梳理一遍&#xff0c;让大家功力猛增&#xff0c;吊打面试官。 1. 消息存储&#xff1a;巧妙利用顺序写 先说…

ARTS Week 43

Algorithm 本周的算法题为 1822. 数组元素积的符号 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。 如果 x 是负数&#xff0c;返回 -1 。 如果 x 是等于 0 &#xff0c;返回 0 。 给你一个整数数组 nums 。令 product 为数…

SimpleFoc以及SVPWM学习补充记录

SimpleFoc SimpleFOC移植STM32&#xff08;一&#xff09;—— 简介 FOC控制的过程是这样的&#xff1a; 对电机三相电流进行采样得到 Ia,Ib,Ic。将 Ia,Ib,Ic 经过Clark变换得到 I_alpha I_beta。将 I_alpha I_beta 经过Park变换得到 Id,Iq。计算 Id,Iq 和其设定值 Id_ref 和…

Spring JDBC - Spring JDBC模版使用

前言 Spring JdbcTemplate是Spring Framework提供的一个强大的数据库访问工具&#xff0c;它简化了数据库操作的过程&#xff0c;为开发者提供了一个高级的数据库访问抽象层。 JdbcTemplate是Spring JDBC模块中的一个核心类&#xff0c;它位于org.springframework.jdbc.core包中…

开源项目都是怎么推广的?

大家好&#xff0c;我是爱折腾的刘大逵。跟我接触过的技术们都知道&#xff0c;一年一年的都在折腾着做一些项目&#xff0c;年年有进步&#xff0c;年年有想法&#xff0c;年年在折腾。今天给大家分享GITEE如何上推荐&#xff01; GITEE推荐有什么用&#xff1f; 众所周知&a…

C++版iwanna2

第二篇目录 程序的流程图程序游玩的效果下一篇博客要说的东西 程序的流程图 #mermaid-svg-lFW0ZjCdi5Xvl3gE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lFW0ZjCdi5Xvl3gE .error-icon{fill:#552222;}#mermaid-s…

《神经网络》—— 循环神经网络RNN(Recurrent Neural Network)

文章目录 一、RNN 简单介绍二、RNN 基本结构1.隐藏中的计算2.输出层的计算3.循环 三、RNN 优缺点1.优点2.缺点 一、RNN 简单介绍 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种用于处理序列数据的神经网络架构。 与传统的前馈神经网络&#xff08…

聆听国宝“心声” 《寻找国宝传颂人——中国国宝大会》走进辽宁

热爱不止&#xff0c;传颂不停。近日&#xff0c;中央广播电视总台《寻找国宝传颂人——中国国宝大会》大型融媒体活动在辽宁省博物馆开展第二场地方展演。辽宁省博物馆是新中国成立后的第一座博物馆&#xff0c;馆藏文物近12万件&#xff0c;珍贵文物数万件&#xff0c;且以藏…

计算机网络:数据链路层详解

目录 一、点对点信道&#xff1a; &#xff08;1&#xff09;封装成帧 &#xff08;2&#xff09;透明传输 &#xff08;3&#xff09;差错检测 二、点对点协议 &#xff08;1&#xff09;数据链路层的特点 &#xff08;2&#xff09;PPP协议的组成 &#xff08;3&…

“我养你啊“英语怎么说?别说成I raise you!成人学英语到蓝天广场附近

“我养你啊”这句经典台词出自周星驰自导自演的电影《喜剧之王》。在这部电影中&#xff0c;周星驰饰演的尹天仇对张柏芝饰演的柳飘飘说出了这句深情而动人的台词。这句台词出现在柳飘飘即将离去之时&#xff0c;尹天仇鼓起勇气&#xff0c;用它作为对柳飘飘个人困境的承诺&…

docker compose入门5—创建一个3副本的应用

1. 定义服务 version: 3.8 services:web:image: gindemo:v2deploy:replicas: 3ports:- "9090" 2. 启动服务 docker compose -f docker-compose.yml up -d 3. 查看服务 docker compose ps 4. 访问服务

pycharm生成的exe执行后报错

元素 application 显示为元素 urn:schemas-microsoft-com:asm.v1^dependentAssembly (此版本的 Windows 不支持)的子元素。 日志名称: Application 来源: SideBySide 日期: 2024/10/8 14:14:12 事件 ID: 72 任务类别: 无 级别…

大数据新视界 --大数据大厂之 Presto 性能优化秘籍:加速大数据交互式查询

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

UE4 材质学习笔记05(凹凸偏移和视差映射/扭曲着色器)

一.凹凸偏移和视差映射 1.偏移映射 这需要一个高度图并且它的分辨率很低&#xff0c;只有256*256&#xff0c;事实上&#xff0c;如果高度图的分辨率比较低并且有点模糊&#xff0c;效果反而会更好 然后将高度图输出到BumpOffset节点的height插槽中&#xff0c; 之后利用得到…

登录注册静态网页实现(HTML,CSS)

实现效果图 实现效果 使用HTML编写页面结构&#xff0c;CSS美化界面&#xff0c;点击注册&#xff0c;跳转到注册界面&#xff0c;均为静态网页&#xff0c;是课上的一个小作业~ 使用正则表达式对输入进行验证&#xff0c;包括邮箱格式验证&#xff0c;用户名格式验证。 正则…

MATLAB数字水印系统

课题介绍 本课题为基于MATLAB的小波变换dwt和离散余弦dct的多方法对比数字水印系统。带GUI交互界面。有一个主界面GUI&#xff0c;可以调用dwt方法的子界面和dct方法的子界面。流程包括&#xff0c;读取宿主图像和水印图像&#xff0c;嵌入&#xff0c;多种方法的攻击&#xf…