关于python中的闭包与for循环(可变变量)的矛盾以及如何避免

2023-11-16

本文只讲一个重点:闭包与for循环之间的矛盾以及避免的方法,关于闭包的概念,请参考网上的概念

废话不多说来看以下代码:

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()

如上所示,很经典的闭包使用,那么如果我们执行f1()并且打印它的返回值答案会是多少,我想很多人会认为是1,但结果不尽人意,我们打印出f1,f2,f3的值我们发现答案竟然是一样的都是9,原因在于闭包中,那个被返回的函数并没有立即执行,而是以某种方式保存了下来,其实,在生活中,就好比你有一个苹果,当你咬下一口让它暴露在空气中以后,再次使用(吃)会被氧化发生了改变一样,闭包的关键在于函数内部能够调用外部的数据,但这些数据的值一定要以最终的形态被内部函数调用,上述代码中,当执行f()时(吃到苹果)那个外部的变量才不会再发生改变,但是在count内部调用不到f()函数所以只能以最后for循环结束的那个3作为i传入

如果一个苹果在外面暴露的太厉害有什么解决方法可以防止苹果氧化吗?

解决方法就是我们把苹果包在一个袋子里这样,就可以减慢氧化的速度,其实解决这个问题也是这样,在f函数外面加一层保护膜:

def count():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
    return fs

在外面的函数中加一个参数绑定当前的i值,我们这样就可以有效的防止闭包的弊端,能够实时的将i的值传给内部函数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于python中的闭包与for循环(可变变量)的矛盾以及如何避免 的相关文章

随机推荐

  • springboot:整合rabbitmq之重试机制

    当我们消息消费失败的时候 可以进行重试 什么情况下会重发消息 1 网络抖动 2 程序抛出异常没有try catch RabbitMQ自动补偿机制触发 多用于调用第三方接口 1 当我们的消费者在处理我们的消息的时候 程序抛出异常情况下 默认无
  • FFmpeg测试视频的实时码流(音视频学习笔记五)

    前言 这篇博文记录一个简单的实时码流测试程序 事实上FFmpeg打开媒体文件后就可以获得整个视频的平均码流 只计算视频码流 但是无法获取实时码流 因为后面的工作需要对编解码做一些优化 需要实时观测码流 这里先实现一个比较简单的版本 运行结果
  • 简单的控制台学生信息系统

    package studentsystem import java util ArrayList import java util Scanner public class APP ArrayList
  • 华为OD机试 - 英文输入法 - 逻辑分析(Java 2023 B卷 100分)

    目录 专栏导读 一 题目描述 1 需求如下 2 注意 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 4 区分大小写 如果联想不到 输出前缀 华为OD机试 2023B卷题库疯狂收录
  • tms xdata开发连接sqlite数据库的rest server

    1 使用向导 2 设置fdconnection的连接属性 3 设置授权 否则服务无法运行 4 运行tms data modeler 工具 5 将刚刚生成的unipersons pas文件加入到工程中 6 结果
  • 互联网摸鱼日报(2023-07-20)

    互联网摸鱼日报 2023 07 20 InfoQ 热门话题 龙蜥操作系统重磅更新 全面支持智能计算 兼容主流AI框架 微软赢麻了 联合Meta 重磅发布开源 可直接商用大模型Llama 2 网友 OpenAI 感觉如何 ChatGPT 提效
  • 【redis事务】@Transactional对Redis事务起作用(包含redis+lua)

    redis事务 Transactional对Redis事务起作用 包含redis lua 一 前言 二 准备 三 StringRedisTemplate 开启事务 四 关键代码 验证 Transactional对redis事务是否生效 五
  • java帧结构_详细解析Java虚拟机的栈帧结构

    什么是栈帧 正如大家所了解的 Java虚拟机的内存区域被划分为程序计数器 虚拟机栈 本地方法栈 堆和方法区 什么 你还不知道 赶紧去看看 Java虚拟机内存结构及编码实战 这次要介绍的栈帧 Stack Frame 就是Java虚拟机中的虚拟
  • stm32F1的JTAG、SWJ作为普通引脚使用。禁用JTAG、SWJ。

    stm32F1的JTAG SWJ引脚 为 PA13 PA14 PA15 PB3 PB4 单片机复位后 默认功能为 JTAG SWJ 而实际使用中 一般只使用 SWCLK SWDIO这两个引脚做 Debug 其余的引脚可以空出来 重新定义为普
  • 红外避障小车(ZK-2)初步拼装

    红外避障小车 ZK 2 初步拼装 一 拼装零件 1 M330螺丝4个 2 M312铜柱4个 3 M8螺丝4个 M36螺丝8个 4 码盘2个 5 M3螺母8个 6 T型小支架4个 7 船型开关1个 8 轮胎2个 9 万向轮1个 10 电池盒1
  • [Java反序列化]AspectJWeaver反序列化

    Java反序列化 AspectJWeaver反序列化 前言 2021年二月份ysoserialize增加了这条AspectJWeaver链子 之后陆续在2021年的D3CTF以及国赛决赛中都出现了这条链子的攻击 所以学习一下AspectJW
  • 深入学习jquery源码之replaceWith()和replaceAll()

    深入学习jquery源码之replaceWith 和replaceAll replaceWith content fn 概述 将所有匹配的元素替换成指定的HTML或DOM元素 参数 content String Element jQuery
  • 网络推广引流方法大全

    在互联网的圈子里有关网络推行的问题是一个永久的话题 你的商品哪怕再好假如没有推行进来一切都是白搭 经常听有人说 酒香不怕巷子深 但分离当今社会的方式 特别是在竞争日益严酷的今天我想 酒香也会怕巷子深了 进入互联网时期 企业产品推行再也不能仅
  • Nosql 概念释义

    进几年常常听到一个高大上的名字 osql 再加上鼓吹者说Nosql将会消灭关系数据库 今天怀着好奇心里 简单了解了以下Nosql的概念 发现其实没有那么神秘 被鼓吹者夸大其词了 导致我等门外汉一下子给打懵了 我认为 一个新技术要想让大家使用
  • IDEA插件系列(9):MyBatisX插件——Mybatis插件

    MybatisX插件功能 mapper和xml可以来回跳转 mybatis xml 映射器 xml提示 mapper和xml支持自动提示 如jpa 参考MybatisCodeHelperPro 集成mybatis生成器Gui 从免费myba
  • 【译】A gentle introduction to self-sovereign identity

    2017年5月17日 ANTONYLEWIS2015 2017年5月 印度互联网和社会智库中心发布了一份报告 详细说明了印度国家身份数据库 Aadhaar 泄漏可能会泄露个人信息的方式 该信息涉及超过1 3亿印度国民 泄密事件为财务欺诈创造
  • 关于习而学的软件工程教育

    邹欣老师的博客在此 http www cnblogs com xinz archive 2012 01 08 2316717 html 我不是很同意邹欣老师的观点 对于一个大学生 思想远比实践经验要重要 子曾经曰过 世界上最简单的事情就是学
  • 再也不用手写爬虫了!推荐5款自动爬取数据的神器!

    大家好 我是菜鸟哥 今天给大家推荐一些不错的神器 网络信息的时代 想要收集信息 爬虫是一项必不可少的工具 对于很多小伙伴们来说 只是想利用爬虫进行快速的内容抓取 而并不想太过深入的学习爬虫 利用python编写爬虫程序虽然炫酷 但是需要耗费
  • java字符串模式匹配next_字符串的模式匹配详解--BF算法与KMP算法

    一 BF算法 BF算法是普通的模式匹配算法 BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配 若相等 则继续比较S的第二个字符和P的第二个字符 若不相等 则比较S的第二个字符和P的第一个字符 依次比较下去 直到得出最后
  • 关于python中的闭包与for循环(可变变量)的矛盾以及如何避免

    本文只讲一个重点 闭包与for循环之间的矛盾以及避免的方法 关于闭包的概念 请参考网上的概念 废话不多说来看以下代码 def count fs for i in range 1 4 def f return i i fs append f