以匿名函数为元素的列表发生的出错

使用列表推导式输出一个以匿名函数为元素的列表发生的出错,其结果是列表里所有元素为同一个匿名函数

f  = [lambda x: i for i in range(3)]    #f是一个匿名函数组成的列表,匿名函数将所有输入简单输出为不同常数加以区分

a = [None] * 3                                 #a用于储存匿名函数传入参数后的输出值
for i in range(3):
    a[i] = f[i](1)
print(a)                                            #输出结果为[2,2,2]

下面采用for 循环能够得到正确答案,但不清楚原因

f = [None] * 3                                  #采用for循环创建列表,初始值为[None, None, None]
for i in range(3):
    f[i] = lambda x : i                         #分别定义列表元素值,若f采用append方法则与上一种方法答案相同

a = [None] * 3                                 #输出
for i in range(3):
    a[i] = f[i](1)
print(a)                                            #[0, 1, 2],得到正确结果

要想第一个达到效果,必须这样写:

f  = [lambda x,i=i: i for i in range(3)]


lambda函数只有一个返回值,不是三个。所以,列表f的长度是一。
要实现你的想法,可以考虑列表推导式。既简单又不易出错。