我一直在尝试使用list comprehension在python中生成lambda函数列表。但它不起作用,
例如
fl=[lambda x: x**i for i in range(5)]
我已经检查了另一个问题,它基本上根据i的引用生成相同的函数。
所以我也尝试过偏爱。
from functools import partial
fl=[partial(lambda x: x**i) for i in range(5)]
但它也没有用。任何帮助将不胜感激。欢呼声〜
答案 0 :(得分:6)
You're tripping over Python scopes
fl=[lambda x, i=i: x**i for i in range(5)]
答案 1 :(得分:6)
您实际上是按名称传递i
。
fl=[lambda x: x**i for i in range(5)]
每次执行lambda
时,它都会将相同的i
绑定到函数,因此当执行该函数(稍后)时,它会使用当前值i
(其中将是4)。您应该将其作为默认参数传递:
fl=[lambda x, j=i: x**j for i in range(5)]
实际上,我注意到你误导了partial
。这里:
fl = [partial(lambda x, y: y ** x, i) for i in range(5)]
这也有效。
答案 2 :(得分:4)
另一个常见的解决方法是使用闭包:
def create_f(i):
def f(x):
return x**i
return f
fl = [create_f(i) for i in range(5)]