lambda 技巧
问题本来是这样的
def mul():
return [lambda x: x*i for i in range(4)]
print [m(2) for m in mul()]
本来期望的结果是 [0, 2, 4, 6] ,但是现在是 [6, 6, 6, 6]
以下回答来源于知乎上 清都山水郎 的回答,在 知乎 app 中没有找到链接。如有侵权,请告知。
来看这样一个问题
x = 10
a = lambda y: x + y
x = 20
b = lambda y: x + y
那么 a(10) 和 b(10) 的结果分别是什么呢?
我们可能都会这样想:a(10) 嘛,不就是第一次 x 和 10 相加嘛,所以结果是 20,所以相应的 b(10) 就是 30 了。但是事实上
lambda 表达式中的 x 是一个只有变量,在运行时绑定值,而不是定义时绑定,这跟函数的默认参数定义是不同的。
这里你就应该明白了第一次定义的 x 是无效的,应该是被第二次的 x 擦除了,在运行时选取 x 的值是 20。
以下是我的理解:
python 是一门解释性语言,在运行之前任何变量都是不确定的,只有在运行时,解释器才会去查找每个变量的值,有些变量可能会被重复定义从而导致值被改变,这也许就是一部分人感觉动态语言难以大规模编写的原因。
有时候会写一些不恰当的 lambda 表达式,比如,通过在一个循环或列表推导中创建一个 lambda 表达式,期望函数能在定义时就记住每次的迭代值。
funcs = [lambda x: x+n for n in range(5)]
for f in funcs:
print f(0)
# 结果是 4 4 4 4 4
实际上 n 的值为迭代的最后一个值。可以这样写:
funcs = [lambda x, n=n: x+n for n in range(5)]
这样就能正常显示 0 1 2 3 4 5 了。
lambda 中使用 print 问题
在 python 2 版本中,我定义了这样一个匿名函数:
x = lambda name: print name
本来期待它能执行成功的吗,结果报了语法错误,让我百思不得其解,然而这行代码在 python 3 中却能成功运行,只要将 print 变成函数即可。
后来在万能的网友指点下:
在 python 2 中,print 是作为声明出现的,可以理解为关键字,但是在 python 中,print 变成了一个函数。需要在 python 2 中让 print() 生效,只需加一行
from __future__ import print_function