当前位置: 首页 > news >正文

Python中的闭包

闭包就是在一个函数内部使用其他函数的变量的情况,即函数包裹着函数(函数中的变量是局部变量,其作用域为函数内部)

闭包的条件:

  1. 在一个函数中又定义了一个内部函数
  2. 外函数有返回值
  3. 返回值为内函数
  4. 内函数中使用了外函数的变量
def outter():
    a = 1
    print("外函数")
    def inner():
        b = 1
        print("内函数")
        print("a+b = {}".format(a+b))
    return inner

res = outter()
res()

外函数
内函数
a+b = 2

闭包的缺点:其作用域没有name直观并且会有一定的内存占用问题,因为变量没有被垃圾回收机制回收
闭包的作用:可以读取外函数中的变量,延长作用域, 闭包将外部的函数常驻的在内存中,导致垃圾不能够及时被回收,所以将局部变量变成了全局变量,所以尽量不要使用闭包
python 中使用闭包的情况可能多数在装饰器中使用

其他写法:

1、

def outter():
    a = 1
    print("外函数")
    def inner():
        b = 1
        print("内函数")
        print("a+b = {}".format(a+b))
    return inner()

res = outter()
print(res)

外函数
内函数
a+b = 2
None

返回的是inner(),而inner()没有返回值,因此在最后还会打印一个None

2、

def outter():
    a = 1
    print("外函数")
    def inner():
        b = 1
        print("内函数")
        print("a+b = {}".format(a+b))
    return inner

res = outter()
print(res)

外函数
<function outter.<locals>.inner at 0x000002D036EA8E50>

函数的调用本质就是一个压栈的过程, 调用res = outter()时候就是一个压栈的过程,当执行完
print(res) 弹栈的过程,局部变量就会被python中的垃圾回收机制回收,回收之后在 inner() 里面使用 a 变量的时候就会报错,但是闭包不会报错,因为没有被回收

相关文章:

  • Java知识【继承中的成员访问特点】
  • <Linux进程控制(2)>——《Linux》
  • 嵌入式软件编程模式
  • VL8 使用generate_for语句简化代码
  • 从零开始搭建uni-app框架的小程序开发环境
  • 【web】TCP/UDP协议详解(字节二面:TCP三次握手、四次挥手)
  • C++打怪升级(二)- 引用详解
  • MongoDB的日志目录被删除了,导致无法启动:(code=exited, status=1/FAILURE)
  • 数据我爬定了,限流也挡不住,我说的
  • 可持久化线段树
  • 计算机网络-网络层篇-子网划分
  • DataX 初识
  • 工程项目管理——第十章 软件项目团队计划
  • 基于Java+SpringBoot+Thymeleaf+Mysql摄影图片分享网站系统设计与实现
  • C#的Dictionary类使用说明
  • @angular/forms 源码解析之双向绑定
  • C语言笔记(第一章:C语言编程)
  • fetch 从初识到应用
  • Java-详解HashMap
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Magento 1.x 中文订单打印乱码
  • React Transition Group -- Transition 组件
  • V4L2视频输入框架概述
  • Vue全家桶实现一个Web App
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 前端_面试
  • 前端学习笔记之观察者模式
  • 探索 JS 中的模块化
  • 移动端 h5开发相关内容总结(三)
  • 中文输入法与React文本输入框的问题与解决方案
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • ​ArcGIS Pro 如何批量删除字段
  • ​决定德拉瓦州地区版图的关键历史事件
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (1)(1.13) SiK无线电高级配置(五)
  • (C++20) consteval立即函数
  • (function(){})()的分步解析
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (四) 虚拟摄像头vivi体验
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)原始图像数据和PDF中的图像数据
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .bat文件调用java类的main方法
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core 2.1路线图
  • .NET Framework 服务实现监控可观测性最佳实践
  • .Net 代码性能 - (1)
  • .NET 回调、接口回调、 委托
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?