上面的语句创建了一个列表 a ,其中有三个元素,每个元素都是一个 lambda 匿名函数。

>>> a = [lambda : x for x in range(3)]
>>> a
[<function <listcomp>.<lambda> at 0x7f79c874ae18>,
<function <listcomp>.<lambda> at 0x7f79c874aea0>,
<function <listcomp>.<lambda> at 0x7f79c874af28>]
>>> a[0]()
2
>>> a[1]()
2
>>> a[2]()
2
>>>

可是为什么三个函数的返回值都为 2 呢?

这是因为函数创建的时候,并没有传递参数,而只有当我们最后调用三个函数的时候,这时候 x 才被作为实参传递进 lambda 函数,而此时的 x = 2,所以三个函数的返回值都为 2。

以下的例子就可以很清晰地说明这个问题

>>> a = []
>>> for i in range(3):
...     a.append(lambda:i)
...
>>> a
[<function <lambda> at 0x7f79c88022f0>,
<function <lambda> at 0x7f79c8802378>,
<function <lambda> at 0x7f79c8802400>]
>>> a[0]()
2
>>> a[1]()
2
>>> a[2]()
2
>>> i
2
>>> i = 10
>>> a[2]()
10
>>>

Python 的 for 循环并不会引入新的作用域,因此当最后调用 lambda 函数的时候,实际上是把当前 i 的值 2 传递了进去,而当我们更改了 i 的值后,函数的返回值也就相应改变了。

再看下面这个例子。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> a = [lambda x=x : x for x in range(3)]
>>> a[0]()
0
>>> a[1]()
1
>>> a[2]()
2
>>> a[2](10)
10

这次,在循环过程中,我们创建函数的时候把 x 的值作为默认参数传递了进去,因此输出就变成了 0, 1, 2,相当于使用了默认参数。

而如果我们将列表替换成元组,a 就变成了一个生成器,看下面的例子。

>>> a = (lambda:x for x in range(3))
>>> a
<generator object <genexpr> at 0x7f79c8f08200>
>>> next(a)
<function <genexpr>.<lambda> at 0x7f79ca827f28>
>>> next(a)
<function <genexpr>.<lambda> at 0x7f79c88022f0>
>>> next(a)
<function <genexpr>.<lambda> at 0x7f79ca827f28>
>>> next(a)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration
>>> a = (lambda:x for x in range(3))
>>> next(a)()
0
>>> next(a)()
1
>>> next(a)()
2
>>> next(a)()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration
>>>

Python教程:对 a = [lambda : x for x in range(3)] 的理解相关推荐

  1. python教程:关于 [lambda x: x*i for i in range(4)] 理解

    题目: lst = [lambda x: x*i for i in range(4)] res = [m(2) for m in lst] print res 实际输出:[6, 6, 6, 6] 想要 ...

  2. python操作excel-python操作excel(内附python教程分享)

    今天学习了下xlwings这个库,目的是为了让计算机自动化操作excel表,当某天需要做一些很繁琐的事情,就可以派上用场啦. python操作excel(内附python教程分享) 基本对象 网上刮来 ...

  3. Python教程:内置函数filter()和匿名函数lambda解析

    一.内置函数filter filter()函数是 Python 内置的一个高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回由符合条件迭代器 ...

  4. Python教程:lambda,filter,map的运用

    1.在学完定义函数def后,又接触了个新的知识,lambda,这个简直可以替代定义函数def啊.用它时,不需要一堆命名,单独定义某个字符,上来直接就是你想的结果,简直是发现新大陆了!不说了,上例子!看 ...

  5. python lambda_Python 匿名函数 lambda

    可以用 lambda 关键字来创建一个匿名函数.lambda 函数可以在需要函数对象的任何地方使用.从语义上来说,它们只是正常函数定义的语法糖. 名词 Lambda( /ˈlæmdə/ 大写Λ,小写λ ...

  6. 电脑下载python教程-python教程pdf下载

    python教程目录介绍 前言 Front Matter Contents 1. 开胃菜 Whetting Your Appetite 2. 使用Python解释器 Using the Python ...

  7. vue函数如何调用其他函数?_好程序员Python教程系列之递归函数与匿名函数调用...

    好程序员Python教程系列递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名函数两种函数 ...

  8. python 廖雪峰数据分析统计服_廖雪峰python教程阅读量统计

    统计了下廖老师的python教程各个小节的阅读量(毫无卵用),廖老师网站反爬做的比我们教务系统可是好多了,一定时间内访问次数多会禁止,反正数据量也不多,就慢慢来,基本上也不会对网站造成什么影响. 刚学 ...

  9. ZetCode Python 教程

    来源:ApacheCN ZetCode 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request. 请您勇敢地去翻译和改进翻译.虽然 ...

最新文章

  1. android 的中文意思
  2. 周洪立:一个外交官眼里的盛大文化
  3. 深入理解并发内存模型||JMM与内存屏障||多核并发缓存架构 ||JMM内存模型||volatile 关键字的作用 ||JMM 数据原子操作||JMM缓存不一致的问题
  4. TurboShop应用特性(2009V3.6)
  5. 浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?
  6. HDU-4850 Wow! Such String!(模拟) ——26行代码AC
  7. [待总结]redmine
  8. 重构机房收费系统(一)
  9. volatile用法
  10. python sys.path
  11. 阿里负载均衡,配置中间证书问题(在starcom申请免费DV ssl)
  12. SQL Server性能优化(13)看懂查询计划
  13. 2021互联网大厂端午礼盒大盘点
  14. github上如何下载单个文件
  15. Dapr+Net6 服务调用09:集群指标收集-普罗米修斯
  16. ZJOI2018游记Round2
  17. 教你windows10系统更改任务栏颜色教程
  18. 【基础篇】Linux的目录结构
  19. 2021-11-02 没羞没臊的商家装傻充愣昧着良知昧着基本人格耍赖达到丧心病狂程度.
  20. 学习Cortex-M:三种关中断方式

热门文章

  1. MHA故障切换和在线手工切换原理
  2. UWP图片编辑器(涂鸦、裁剪、合成)
  3. FTP 500 OOPS
  4. 点滴积累【C#】---操作xml,将xml数据显示到treeview
  5. spring3.x企业应用开发实战 pdf_吃透Spring全家桶:Spring源码+SpringBoot+SpringCloud实战...
  6. c++编码规范_Python02编码规范
  7. 【技术好文转载】未来技术前瞻
  8. 【ABAP妙用】复制ALV之负号提前
  9. 【实用】SAP修改记录表开发
  10. 定义进项税代码缺省值