Python列表解析与lambdas

参见英文答案 > How do I create a list of Python lambdas (in a list comprehension/for loop)?                                    8个
我正在运行Python 3.4.2,我对我的代码行为感到困惑.我正在尝试以增加的程度创建可调用多项式函数的列表:

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

但是由于某种原因,

print([b(5) for b in bases])
# [25, 25, 25]

为什么基数似乎是最后一个lambda表达式的列表,在列表理解中重复?

最佳答案
这个问题是classic
“gotcha”
,是
我在lambda函数中引用的是not looked up until the
lambda function is called
.那时,i的值是它的最后一个值
当循环结束时,即2.

如果将我绑定到lambda函数定义中的默认值,那么每个i将成为一个局部变量,并且在默认值被定义而不是调用时,它的默认值被计算并绑定到该函数.

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

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]

以供参考:

> Python scopes and namespaces

转载注明原文:Python列表解析与lambdas - 代码日志