Python列表理解与lambdas

hen*_*ace 19 python lambda

我正在运行Python 3.4.2,我对代码的行为感到困惑.我正在尝试创建一个可调用多项式函数列表,其程度越来越高:

bases = [lambda x: x**i for i in range(3)]
Run Code Online (Sandbox Code Playgroud)

但出于某种原因,它做到了这一点:

print([b(5) for b in bases])
# [25, 25, 25]
Run Code Online (Sandbox Code Playgroud)

为什么bases看起来似乎是列表理解中最后一个lambda表达式的列表,重复?

unu*_*tbu 22

这个问题是一个经典的"问题",就是i调用lambda函数之前,不会查找 lambda函数中引用的问题.那时,值ifor-loop结束时绑定的最后一个值,即2.

如果绑定ilambda函数定义中的默认值,则每个都i成为局部变量,并且在定义 lambda 而不是调用lambda时,会计算其默认值并绑定到函数.

因此,当调用lambda时,i现在在本地范围内查找,并使用其默认值:

In [177]: bases = [lambda x, i=i: x**i for i in range(3)]

In [178]: print([b(5) for b in bases])
[1, 5, 25]
Run Code Online (Sandbox Code Playgroud)

以供参考:

  • 整洁(+1).如果答案解释了为什么原始代码不起作用,以及为什么会这样做,那就太棒了.谢谢. (2认同)