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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • 印度登月最关键一步!月船三号今晚进入环月轨道

    8月5日消息,据印度官方消息,月船三号将于北京时间今晚21时30分左右开始近月制动进入环月轨道。这是该探测器能够成功的最关键步骤之一,如果成功将开始围
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 2299元起!iQOO Pad开启预售:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其搭载了天玑
  • Counterpoint :OPPO双旗舰战略全面落地 高端产品销量增长22%

    2023年6月30日,全球行业分析机构Counterpoint Research发布的《中国智能手机高端市场白皮书》显示,中国智能手机品牌正在寻求高质量发展,中国高端智能
  • 外交部:美方应停止在网络安全问题上不负责任地指责他国

      中国外交部今天(16日)举行例行记者会。会上,有记者问,美国情报官员称,他们正在阻拦来自中国以及其他国家的黑客获取相关科研成果。 中方对此有何评论?对此
Top