动态创建lambda表达式

时间:2015-07-27 22:44:26

标签: python python-2.7

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

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

0
2
4
6

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

>>> 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
>>> 

答案 2 :(得分:1)

i的值未存储在lambda函数中。这就是你得到你所看到的结果的原因:Python正在使用它在调用函数时找到的i的值。