关于python:动态创建lambda表达式

Creating lambda expressions on the fly

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def multipliers():
  l = []
  for i in range(4):
    l.append(lambda x : x * i )
  return l

>>> ll[0](2)
6
>>> ll[1](2)
6
>>> ll[2](2)
6
>>> ll[3](2)
6

你能解释一下结果吗?我希望得到:

1
2
3
4
0
2
4
6


原因是Python的闭包是后期绑定的。这意味着在调用内部函数时会查找闭包中使用的变量值。因此,当调用multipliers()返回的任何函数时,会在当时的周围范围中查找i的值。到那时,无论调用哪个返回函数,for循环都已完成,i的最终值为3。因此,每个返回函数的值都乘以3传递的值,因此,由于在上述代码中传递了2的值,因此它们都返回6的值。

摘自:http://www.toptal.com/python/interview-questions


问题是,正如人们所说,i不是lambda的局部变量。您必须解决这个问题:使用在循环过程中更改的默认参数值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> def multipliers():
  l = []
  for i in range(4):
    l.append(lambda x, i=i : x * i )
  return l

>>> lst = multipliers()
>>> lst[0](2)
0
>>> lst[1](2)
2
>>> lst[2](2)
4
>>> lst[3](2)
6
>>>


i的值不存储在lambda函数中。这就是您得到结果的原因:python使用的是它在调用函数时找到的i的值。