我喜欢通过参数列表定义函数列表,以实际构成来自有限数量的单极子和偶极子的电势。
但是,由于某种原因,python列表中的函数的行为不符合预期(由我)。
以下示例:
def function(coefficients):
phi = []
i = 0
for y in coefficients:
f = lambda x: y*(x**i)
i += 1
phi.append(f)
print f(2)
return phi
> phi = function([1,2,3])
2
8
24
> k0 = phi[0]
> k1 = phi[1]
> k2 = phi[2]
> print k0(2), k1(2), k2(2)
24 24 24
始终检索列表中的最后一个函数,而不依赖于从列表中选择哪个函数。
有什么想法吗?
提前致谢。
答案 0 :(得分:5)
由于closure属性,lambda函数保存对变量y
的引用。因此,所有函数都具有对同一对象的引用,并且它们将在调用期间获得y
的最后一个值。要解决这个问题,
f = lambda x,y=y,i=i: y*(x**i)
现在,我们创建了另一个参数y
,其默认值为y
。它使函数现在依赖于本地引用。因此,即使y
的值在循环中发生变化,lambda函数也不再引用y
。
注意:同样的解释也适用于变量i
。
为了清楚说明,我建议使用不同的变量名称
f = lambda x, z=y, j=i: z * (x ** j)
注意:您的原始输出为2 8 24
。那是因为,当你调用这个函数时,i
增加了,我不认为那是你真正想要的。实际输出应为1 4 12
。