美好的一天,
我对以下内容感到困惑:
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的抱怨是什么。建议会有所帮助。
答案 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
的值。