我有一个函数数组,我正在尝试生成一个函数,该函数由我的数组中的元素组成.
我的方法是:
def compose(list):
if len(list) == 1:
return lambda x:list[0](x)
list.reverse()
final=lambda x:x
for f in list:
final=lambda x:f(final(x))
return final
这种方法似乎不起作用,将不胜感激.
(我正在颠倒列表,因为这是我想要函数的组合顺序)
解决方法:
它不起作用,因为您在循环中创建的所有匿名函数都引用相同的循环变量,因此共享其最终值.
作为快速修复,您可以将作业替换为:
final = lambda x, f=f, final=final: f(final(x))
或者,您可以从函数返回lambda:
def wrap(accum, f):
return lambda x: f(accum(x))
...
final = wrap(final, f)
要了解发生了什么,请尝试以下实验:
>>> l = [lambda: n for n in xrange(10)]
>>> [f() for f in l]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
这个结果让许多人感到惊讶,他们期望结果是[0,1,2,…].但是,所有lambda都指向相同的n变量,并且都引用它的最终值,即9.在你的情况下,所有应该嵌套的final的版本最终都指向相同的f,更糟糕的是,到同一个决赛.
Python中lambdas和for循环的主题是already covered on SO.