对 a = [lambda : x for x in range(3)] 的理解
- 上面的语句创建了一个列表 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 的值后,函数的返回值也就相应改变了。
再看下面这个例子。
>>> 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
>>>
获取更多精彩,请关注「seniusen」!

对 a = [lambda : x for x in range(3)] 的理解的更多相关文章
- python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))
1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...
- Python特殊语法:filter、map、reduce、lambda [转]
Python特殊语法:filter.map.reduce.lambda [转] python内置了一些非常有趣但非常有用的函数,充分体现了Python的语言魅力! filter(function, s ...
- Python filter,map,lambda,reduce,列表解析
filter用法 filter(func,seq) 将seq的元素逐一代入func,通过func的返回值来判断是保留还是过滤 >>> def foo(x): return x> ...
- Python的lambda表达式
使用lambda来创建匿名函数,而用def创建的方法是有名称的,除了从表面上的方法名不一样外,python lambda还有哪些和def不一样呢? 1 python lambda会创建一个函数对象,但 ...
- python中的lambda
lambda表达式返回一个函数对象 例子: func = lambda x,y:x+y func相当于下面这个函数 def func(x,y): return x+y 注意def是语句而lambda是 ...
- Python中Lambda, filter, reduce and map 的区别
Lambda, filter, reduce and map Lambda Operator Some like it, others hate it and many are afraid of t ...
- 【转】python中的lambda函数
http://www.cnblogs.com/coderzh/archive/2010/04/30/python-cookbook-lambda.html lambda函数也叫匿名函数,即,函数没有具 ...
- lambda, reduce, map求阶乘之和
学完这几个优雅的内建函数,就可以做一些有趣的小练习来激发兴趣了.而python最大的好处便是简洁,看下边要求 用1行代码求 1! + 2! + 3! + ... + 10! 求阶乘 reduce函数用 ...
- python几个特别函数map filter reduce lambda
lambda函数也叫匿名函数,即,函数没有具体的名称.先来看一个最简单例子: def f(x): return x**2 print f(4) Python中使用lambda的话,写成这样 g = l ...
随机推荐
- HDU 1426 Sudoku Killer(dfs 解数独)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1426 Sudoku Killer Time Limit: 2000/1000 MS (Java/Oth ...
- 【SQL SERVER学习笔记】Sqlserver游标的尝试
DECLARE @ProName NVARCHAR(50)DECLARE @CityName NVARCHAR(50)DECLARE @ProId INT DECLARE @CityId INT DE ...
- SuperSocket 学习
http://www.cnblogs.com/Anaren/p/6382841.html https://www.assetstore.unity3d.com/en/#!/content/21721 ...
- Flask—05-理解掌握flask数据模型(01)
数据模型 数据库回顾 分类: 关系型数据库:MySQL.sqlite.… 非关系型数据库:Redis.MongoDB.… 操作: 执行原生SQL语句,每次都需要拼接SQL语句,非常繁琐而且特别容易出错 ...
- java中泛型的简单使用
泛型是在jdk1.5之后引入的,我们可以在类的声明处增加泛型列表,如:<T,E,V>.此处,字符可以是任何标识符,一般采用这3个字母. 1.泛型类声明 class MyCollection ...
- 你不知道的javaScript笔记(3)
对象 对象可以通过两种形式定义: 声明形式和构造形式 声明形式语法: var myObj = {key:value} 构造形式语法: var myObj = new Object(); myObj.k ...
- ABAP术语-HTML
HTML 原文:http://www.cnblogs.com/qiangsheng/archive/2008/02/19/1073298.html Hypertext Markup Language( ...
- mysql数据库关于事务的问题?求解答
表格代码: CREATE TABLE `t_teacher` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, `deposit` ) DEFA ...
- flask之请求钩子
from flask import Flask from flask import abort app = Flask(__name__) # 在第一次请求之前调用,可以在此方法内部做一些初始化操作 ...
- mysql 查询各个阶段所消耗的时间