Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Lambdas和字典_Python_Dictionary_Lambda - Fatal编程技术网

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想要的)