我试图使用推导式来编写lambda列表,其中每个lambda在调用时将打印索引,即它在列表中的位置。
list = [lambda : print(i) for i in range(10)]
list[0]()
但问题是调用任何一个lambda都产生相同的结果,它们输出9。我怎样才能以我想要的方式获取I的值呢?
您需要确保在lambda定义时计算i
并将其绑定在lambda的主体内,而不是将其延迟到调用(此时循环已经完成,i = 9
)。这样做的一种方法是使用i
作为lambda参数的默认值,因为默认值是在定义函数时评估的,而不是在调用函数时:
>>> funcs = [lambda x=i: print(x) for i in range(10)]
>>> funcs[0]()
0
>>> funcs[1]()
1
注意,你实际上不需要使用不同的变量名;您可以将参数命名为i
,它将被隐藏在lambda主体中,并且仍然以相同的方式工作:
>>> funcs = [lambda i=i: print(i) for i in range(10)]