Python中的延迟绑定原理详解


Posted in Python onOctober 11, 2019

直接看下面例子

my_ld = [lambda x:x*i for i in range(3)]
my_list = [ld(2) for ld in my_ld]
print(my_list)

本想是想通过以上代码,输出[0, 2, 4]的,但结果却是[4, 4, 4]

下面说下本人对这个结果的理解:

因为Python解释器,遇到lambda(或者def),只是定义了一个匿名函数对象,并保存在内存中,只有等到调用这个匿名函数的时候,才会执行函数内部的代码(x*i)。所以匿名函数中的i并不是立即引用后面循环中的i值的,而是在调用嵌套函数的时候,才会查找i的值,这个特性也就是延迟绑定。

而 for i in range(3) 是另外一个表达式,Python解释器解释到就会直接执行,代码执行到ld(2)时,循环已经结束了,此时的i指向2 ,my_ld为包含了三个匿名函数对象的列表,所以打印my_list的结果是[4, 4, 4]。

如果我们要输出[0, 2, 4], 可以给lambda表达式多加一个缺省参数a=i,代码如下:

my_ld = [lambda x, a=i:x*a for i in range(3)]
my_list = [ld(2) for ld in my_ld]
print(my_list)

Python函数中的缺省参数,是在Python解释器遇到lambda a=i (或者def(a=i))时,就必须初始化默认值,此时 每循环一次,缺省参数a就需要找一次i的引用。i=0时,第一个匿名函数的默认参数值就是0,i=1时,第二个匿名函数的默认参数值就是1,以此类推。所以当代码执行到ld(2)时,每个匿名函数中a的默认值都不一样。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python是编译运行的验证方法
Jan 30 Python
Python实现简单的代理服务器
Jul 25 Python
Python的for和break循环结构中使用else语句的技巧
May 24 Python
python3安装pip3(install pip3 for python 3.x)
Apr 03 Python
python去除文件中重复的行实例
Jun 29 Python
python matlibplot绘制多条曲线图
Feb 19 Python
Python模块的加载讲解
Jan 15 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
Apr 18 Python
python matplotlib折线图样式实现过程
Nov 04 Python
opencv 实现特定颜色线条提取与定位操作
Jun 02 Python
numpy中生成随机数的几种常用函数(小结)
Aug 18 Python
Python的scikit-image模块实例讲解
Dec 30 Python
python pycharm的安装及其使用
Oct 11 #Python
详解Python3迁移接口变化采坑记
Oct 11 #Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
Oct 11 #Python
Pycharm 2019 破解激活方法图文详解
Oct 11 #Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 #Python
python脚本调用iftop 统计业务应用流量的思路详解
Oct 11 #Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 #Python
You might like
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
jquery animate 动画效果使用说明
2009/11/04 Javascript
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
2019/04/12 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
python爬虫的工作原理
2017/03/05 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
django的csrf实现过程详解
2019/07/26 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
Python解释器及PyCharm工具安装过程
2020/02/26 Python
python右对齐的实例方法
2020/07/05 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
英国最大的独立家具零售商:Furniture Village
2016/09/06 全球购物
酒店保安领班职务说明书
2014/03/04 职场文书
意向协议书范本
2014/04/23 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
公务员政审个人总结
2015/02/12 职场文书
护理工作个人总结
2015/03/03 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
公司职员入党自传书
2015/06/26 职场文书
nginx优化的六点方法
2021/03/31 Servers
详细介绍python类及类的用法
2021/05/31 Python
浅析Python实现DFA算法
2021/06/26 Python
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android