当前位置:首页 > 科技  > 软件

Python中看似没用的写法,却是老手都不一定会的原理。解决闭包延迟绑定

来源: 责编: 时间:2023-12-08 09:14:41 305观看
导读一次无意间看到如下的代码:心想:咦?这不是脱裤子放屁吗?函数里面直接使用变量就好了,非要定义成函数参数。结果没想到这是解决问题的关键。今天我们研究一下这玩意到底解决什么问题以及它的原理。现在我们从最简单的函数

一次无意间看到如下的代码:rng28资讯网——每日最新资讯28at.com

rng28资讯网——每日最新资讯28at.com

心想:咦?这不是脱裤子放屁吗?函数里面直接使用变量就好了,非要定义成函数参数。rng28资讯网——每日最新资讯28at.com

结果没想到这是解决问题的关键。今天我们研究一下这玩意到底解决什么问题以及它的原理。rng28资讯网——每日最新资讯28at.com

现在我们从最简单的函数使用外部变量的情况开始:rng28资讯网——每日最新资讯28at.com

rng28资讯网——每日最新资讯28at.com

为了在函数中使用外部的变量,这是最直观的做法。这种在函数中直接使用外部定义的变量,还有一种叫法:'闭包'。rng28资讯网——每日最新资讯28at.com

我相信就算不了解 python 查找变量规则的初学者,也能一下子理解函数执行后会输出什么。因为 python 就是为了让其符合直觉才把规则设计成这样。rng28资讯网——每日最新资讯28at.com

现在稍微修改一下代码:rng28资讯网——每日最新资讯28at.com

rng28资讯网——每日最新资讯28at.com

在函数执行之前,修改了外部的变量,大家认为函数执行后打印了什么?rng28资讯网——每日最新资讯28at.com

看看结果:rng28资讯网——每日最新资讯28at.com

rng28资讯网——每日最新资讯28at.com

不知道你猜对了没有,不过我是觉得这个结果同样符合直觉。rng28资讯网——每日最新资讯28at.com

你也觉得结果符合直觉吗?rng28资讯网——每日最新资讯28at.com

rng28资讯网——每日最新资讯28at.com

这是因为函数里面使用外部变量,就是要表达:“执行 print 时,获取变量此时此刻的值。rng28资讯网——每日最新资讯28at.com

那么,现实中会不会出现一些场景,我们就是希望函数执行时,得到的是 创建函数的时候,外部变量的值,而非执行时刻的值 ?rng28资讯网——每日最新资讯28at.com

没错,就是文章开篇的写法:rng28资讯网——每日最新资讯28at.com

rng28资讯网——每日最新资讯28at.com

真的存在这样子的场景吗?而且,这是什么原理?rng28资讯网——每日最新资讯28at.com

我们可以归纳以上代码的特点:rng28资讯网——每日最新资讯28at.com

  • 定义了函数
  • 函数内部,希望使用外部定义的变量
  • 定义函数后,并没有立刻执行,并且当函数执行的时候,使用的外部变量很可能已经被修改了

由于 python 写交互的程序不多,一个函数的执行时机基本上都是我们使用代码明确编写。但是大概有2种例外情况:rng28资讯网——每日最新资讯28at.com

  • 把函数交给别的调度器,在合适时机执行。比如多线程多进程
  • 在界面编程中,绑定各种事件。事件函数只会在用户与界面交互时才被触发执行

在这些场景中,最容易出现的情况是,在一个循环遍历中,定义函数,绑定函数。下面是一个循环创建10个按钮,点击时界面出现提示信息:rng28资讯网——每日最新资讯28at.com

rng28资讯网——每日最新资讯28at.com

上面的代码创建了10个不同的函数对象,可惜的是,行7的变量 idx 是外部的变量 idx(行4),并且在循环执行过程中,idx 的值不断增加,最终的值停留在 9。rng28资讯网——每日最新资讯28at.com

因此,界面上不管点击哪个按钮,显示信息都是 9rng28资讯网——每日最新资讯28at.com

rng28资讯网——每日最新资讯28at.com

现在,我们使用之前学会的套路,定义函数参数默认值解决:rng28资讯网——每日最新资讯28at.com

rng28资讯网——每日最新资讯28at.com

我特意让参数名与外部变量不一致,这更容易理解原理。rng28资讯网——每日最新资讯28at.com

到底为什么这样子写可以解决问题,我们不妨把循环给展开(只展开2次):rng28资讯网——每日最新资讯28at.com

rng28资讯网——每日最新资讯28at.com

注意行15 与 行23 ,定义函数的时候,我们把此刻的 idx 值,付给了参数 num 作为默认值。相当于如下代码:rng28资讯网——每日最新资讯28at.com

rng28资讯网——每日最新资讯28at.com

此时,这个默认值不再随 idx 修改而改变。所以每个按钮绑定的函数,看似代码逻辑是一模一样,但是每个函数的参数 num 都是不一样的值。rng28资讯网——每日最新资讯28at.com

你学会了吗?rng28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-39512-0.htmlPython中看似没用的写法,却是老手都不一定会的原理。解决闭包延迟绑定

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 深入理解并发控制:掌握锁的精髓,你学会了吗?

下一篇: Netty入门实践:模拟IM聊天

标签:
  • 热门焦点
  • 印度登月最关键一步!月船三号今晚进入环月轨道

    8月5日消息,据印度官方消息,月船三号将于北京时间今晚21时30分左右开始近月制动进入环月轨道。这是该探测器能够成功的最关键步骤之一,如果成功将开始围
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就“胡锡进炒股是否知道认真报道”展开讨论。有
  • 半导体需求下滑 三星电子DS业务部门今年营业亏损预计超10万亿韩元

    7月17日消息,据外媒报道,去年下半年开始的半导体需求下滑,影响到了三星电子、SK海力士、英特尔等诸多厂商,营收明显下滑,部分厂商甚至出现了亏损。作为
  • 最薄的14英寸游戏笔记本电脑 Alienware X14已可以购买

    2022年1月份在国际消费电子展(CES2022)上首次亮相的Alienware新品——Alienware X14现在已经可以购买了,这款笔记本电脑被誉为世界上最薄的 14 英寸游戏笔
Top