Lambdas和词典

时间:2014-01-07 16:46:35

标签: python dictionary lambda

美好的一天,

我对以下内容感到困惑:

v = {}

v[-1] = lambda x: 1
v[0]  = lambda x: x

for k in range(1, n):    # k = 1...n-1   
    v[k] = lambda x: 2*x*v[k-1](x) - v[k-2](x)
当我拨打maximum recursion depth exceeded时,

会生成错误v[3](1),而这会:

v = {}  

v[-1] = lambda x: 1
v[0]  = lambda x: x

v[1] = lambda x: 2*x*v[1-1](x) - v[1-2](x)
v[2] = lambda x: 2*x*v[2-1](x) - v[2-2](x)
v[3] = lambda x: 2*x*v[3-1](x) - v[3-2](x)

工作得很好。在第一种情况下,我无法弄清楚Python的抱怨是什么。建议会有所帮助。

2 个答案:

答案 0 :(得分:3)

Python中的Lambdas是闭包。在评估Lambda之前,不会评估您为Lmabda提供的参数。那时,k=n无论如何,因为你的迭代已经完成。

证明:

>>> l = {}
>>> for k in range(1, 10):
    l[k] = lambda x: k
>>> for v in l.values():
    print v('')


9
9
9
9
9
9
9
9
9

答案 1 :(得分:3)

正如Inbar Rose指出的那样,k是一个全局的,并且在创建lambda时不进行求值。但是,有一种方法可以在声明时让python评估k:

for k in range(1, n):    # k = 1...n-1   
    v[k] = lambda x, k=k: 2*x*v[k-1](x) - v[k-2](x)

这个k=k声明一个变量k,lambda的本地变量,是可选的,默认值是声明时k的值。