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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的“新电商三兄弟”成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。“提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
Top