为什么lambda函数保持循环的最后一步的形式?

时间:2014-05-22 11:55:14

标签: python string loops lambda

我试图为字符串列表创建一个lambda函数列表。

columns = ['a', 'b', 'c']
formats = []
for i, v in enumerate(columns)
    formats.append(lambda x: str(i + 1) + '%4f' %x)

并且formats[0](12)的输出应该是1:12.0000

但结果证明,无论我使用formats[0](13)formats[1](26)还是formats[2](12),输出始终都是3:##.####

它似乎始终保持最后一个循环的格式。为什么?有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

请参阅http://www.toptal.com/python/top-10-mistakes-that-python-programmers-make错误#6。 Python在调用函数时绑定闭包中的变量,而不是在定义函数时绑定。

答案 1 :(得分:1)

这是因为i的值在创建时并未绑定到lambda。解决此问题的一种方法是将其作为默认参数传递

formats.append(lambda x, i=i: str(i + 1) + '%4f' %x)