Python中的延迟绑定原理详解

作者:爱哭鼻子的小忧伤 时间:2022-07-08 16:18:35 

直接看下面例子


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的默认值都不一样。

来源:https://www.cnblogs.com/heimaguangzhou/p/11640670.html

标签:python,延迟,绑定
0
投稿

猜你喜欢

  • Go语言编程中对文件读写的基本方法整理

    2023-06-24 09:31:07
  • MySQL数据库查询之多表查询总结

    2024-01-13 21:49:47
  • python脚本实现统计日志文件中的ip访问次数代码分享

    2021-03-17 08:40:08
  • Python django搭建layui提交表单,表格,图标的实例

    2022-09-18 19:40:19
  • Mysql中批量替换某个字段的部分数据(推荐)

    2024-01-14 19:56:04
  • selenium+python实现自动化登录的方法

    2021-08-07 13:38:08
  • django 将自带的数据库sqlite3改成mysql实例

    2024-01-19 14:52:21
  • python实现跳表SkipList的示例代码

    2022-04-05 05:01:53
  • 使用SQL SERVER存储过程实现历史数据迁移方式

    2024-01-13 04:07:40
  • 详解python实现识别手写MNIST数字集的程序

    2021-05-01 13:17:40
  • 解决Python数据可视化中文部分显示方块问题

    2021-01-27 03:53:36
  • 10个糟糕的IE Bug及其修复

    2010-05-13 16:26:00
  • 老生常谈python之鸭子类和多态

    2023-09-26 09:00:26
  • Python采集王者皮肤图片实战示例

    2021-08-02 12:09:23
  • js与jquery获取父级元素,子级元素,兄弟元素的实现方法

    2024-05-11 09:43:01
  • MySQL优化之大字段longtext、text所生产的问题

    2024-01-28 11:37:43
  • SQL_Server全文索引的用法解析

    2024-01-17 08:37:14
  • numpy matrix和array的乘和加实例

    2022-09-29 15:17:45
  • python爬取各省降水量及可视化详解

    2023-08-04 15:19:57
  • Python函数中的全局变量详解

    2022-08-05 13:58:34
  • asp之家 网络编程 m.aspxhome.com