Python Lambdas和字典
你好 我对以下几点感到困惑:Python Lambdas和字典,python,dictionary,lambda,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) 当我调用(例如,v[3](1))时,生成一个超过最大递归深度的错误,而这: v = {} v[-1] = lambda x: 1 v[0] = lambda x: x v[1] =
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)
当我调用(例如,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在第一种情况下的抱怨是什么。建议会很有帮助。Python中的lambda是闭包。在对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
正如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
的值。另外,使用dis
模块,dis.dis(v[1])
给出了一行有趣的代码:10 LOAD\u GLOBAL 1(k)
这表明k的值在循环过程中没有被计算。这就是问题所在……但你还没有提出解决方案。问题是“是什么导致了这种行为”,这回答了这个问题。我不能提供一个解决方案,因为既然OP意识到他的计划行不通,他应该提出一个新的想法,如果他有问题,他可以来问另一个问题。此外,@njzk2提供了一个对OP有效的解决方案(尽管这可能不是OP想要的)