def multipliers():

return [lambda x : i * x for i in range(4)]

print [m(2) for m in multipliers()]

你如何修改上面的multipliers的定义产生想要的结果?

上面代码输出的结果是[6, 6, 6, 6] (不是我们想的[0, 2, 4, 6])。

上述问题产生的原因是Python闭包的延迟绑定。这意味着内部函数被调用时,参数的值在闭包内进行查找。因此,当任何由multipliers()返回的函数被调用时,i的值将在附近的范围进行查找。那时,不管返回的函数是否被调用,for循环已经完成,i被赋予了最终的值3。

因此,每次返回的函数乘以传递过来的值3,因为上段代码传过来的值是2,它们最终返回的都是6。(3*2)碰巧的是,《The Hitchhiker’s Guide to Python》也指出,在与lambdas函数相关也有一个被广泛被误解的知识点,不过跟这个case不一样。由lambda表达式创造的函数没有什么特殊的地方,它其实是和def创造的函数式一样的。

下面是解决这一问题的一些方法。

一种解决方法就是用Python生成器。

def multipliers():

for i in range(4): yield lambda x : i * x

另外一个解决方案就是创造一个闭包,利用默认函数立即绑定。

def multipliers():

return [lambda x, i=i : i * x for i in range(4)]

还有种替代的方案是,使用偏函数:

from functools import partial

from operator import mul

def multipliers():

return [partial(mul, i) for i in range(4)]

python闭包的延迟绑定_浅析Python的闭包和延迟绑定相关推荐

  1. python闭包两种写法_浅析Python闭包

    一.什么是闭包python 在介绍闭包概念前,咱们先来看一段简短的代码数组 def sum_calc(*args):defwrapper(): sum=0for n inargs: sum+=n;re ...

  2. python字典嵌套字典构造_浅析python 字典嵌套

    为什么需要嵌套? 有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套 .你可以在列表中嵌套字典.在字典中嵌套列表甚至在字典中嵌套字典. 字典列表 例如:字典alien_0包含 ...

  3. python中tracer函数意思_浅析Python编写函数装饰器

    本节主要介绍编写函数装饰器的相关内容. 跟踪调用 如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息. 这是一个通过类装饰的语法写成的装饰器,测试如下: 运 ...

  4. anaconda中的python如何进行关联分析_浅析python,PyCharm,Anaconda三者之间的关系

    一.它们是什么? Python是一种跨平台的计算机程序设计语言,简单来说,python就是类似于C,Java,C++等,一种编程语言. 2.Anaconda Anaconda指的是一个开源的Pytho ...

  5. python中main的作用_浅析python 中__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  6. python 定时执行 爬虫 模块_浅析python实现scrapy定时执行爬虫

    项目需要程序能够放在超算中心定时运行,于是针对scrapy写了一个定时爬虫的程序main.py ,直接放在scrapy的存储代码的目录中就能设定时间定时多次执行. 最简单的方法:直接使用Timer类 ...

  7. python 多条件 选择 算法_浅析Python中的多条件排序实现

    多条件排序及itemgetter的应用曾经客户端的同事用as写一大堆代码来排序,在得知Python排序往往只需要一行,惊讶无比,遂对python产生浓厚的兴趣. 之前在做足球的积分榜的时候需要用到多条 ...

  8. python派落塔问题_浅析python递归函数和河内塔问题

    关于递归函数: 函数内部调用自身的函数. 以n阶乘为例: f(n) = n ! = 1 x 2 x 3 x 4 x...x(n-1)x(n) = n x (n-1) ! def factorial(n ...

  9. python的四种内置数字类型_浅析Python数字类型和字符串类型的内置方法

    一.数字类型内置方法 1.1 整型的内置方法 作用 描述年龄.号码.id号 定义方式 x = 10 x = int('10') x = int(10.1) x = int('10.1') # 报错 内 ...

最新文章

  1. hibernate join fetch
  2. 超牛EXCEL操作技巧,用的好,会涨工资哦
  3. python怎么读文件名-python读取文件名并改名字的实例
  4. 【Tools】MarkDown教程(一)-MarkDown简介
  5. 单调栈思维 2021年度训练联盟热身训练赛第三场——K题 Summer Trip
  6. 适用于Java开发人员的Elasticsearch:命令行中的Elasticsearch
  7. 实验五 burpsuite重放攻击实验
  8. Git的下载与安装(详细)
  9. sql 数据库维护索引_SQL索引维护
  10. java留言板功能齐全源码_各类Java微信开发框架源码对比(建议收藏)
  11. Oracle PL/SQL之NEXT_DAY - 取得下一个星期几所在的日期
  12. android对象缓存,【Android教程】缓存对象中的顶点数组和数据索引
  13. 008 [转载]文件后缀查询
  14. 领导力有哪些方面?什么是领导力?
  15. 估值择时对ETF基金定投的影响
  16. 计算机仿真撤稿,LOL云顶之弈11.5天神裁决天使阵容攻略 新版本裁决天使运营思路...
  17. 组件化与插件化的差别在哪里?醍醐灌顶!
  18. 计算机专业术语大全,计算机专业名词总汇,计算机专业名词总汇
  19. 云服务器被植入挖矿木马,CPU飙升200%处理方案
  20. 玩手机上瘾怎么办,怎么戒

热门文章

  1. 指数随机变量 泊松过程跳_《常见随机过程》(一)
  2. Python的单例模式
  3. Spring Boot实现监控linux-cpu和内存使用情况,并发送邮件
  4. 线性表的动态顺序存储和实现(C语言实现)【线性表】(4)
  5. 伪mac android,Mac,android sdk,monkey压力测试,真机
  6. c语言 10以内加法,求助 给小学生出题,自己选加减乘除 做10题 10以内的数 然后统计分...
  7. 华为认证数通专家HCIE-Datacom 11月30日发布
  8. 一文带你认识:Liunx的历史
  9. 【面试必备】静态路由与配置相关知识点详解
  10. Serverless 工程实践 | 零基础上手 Knative 应用