一系列功能的奇怪行为

时间:2014-04-09 15:50:52

标签: python

我喜欢通过参数列表定义函数列表,以实际构成来自有限数量的单极子和偶极子的电势。

但是,由于某种原因,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

始终检索列表中的最后一个函数,而不依赖于从列表中选择哪个函数。

有什么想法吗?

提前致谢。

1 个答案:

答案 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