为什么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:##.####

似乎总是保持上一个循环的格式。为什么?有人能帮忙吗?

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

这是因为i的值在创建时没有绑定到lambda。解决这个问题的一种方法是将其作为默认参数

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

最新更新