下面这一行代码你会觉得产生什么结果呢?
allfun = [ (lambda a: a+i) for i in range(4) ]
理所当然地,我认为应该得到下面四个匿名函数:
allfun = [
lambda a: a+0,
lambda a: a+1,
lambda a: a+2,
lambda a: a+3
]
于是我们实验一下,如果得到的值是:10 11 12 13 ,那说明我的猜想是对的,然而却得到了13 13 13 13 :
allfun = [ lambda a: a+i for i in range(4) ]
for i in range(4):
print( allfun[i](10), end=' ' )
那说明了产生的是下面四个匿名函数,我们可以看到i 全部都是range 的最后一个数——3 :
allfun = [
lambda a: a+3,
lambda a: a+3,
lambda a: a+3,
lambda a: a+3
]
最后得到的解决办法:在匿名函数形参列表中使用myi=i 主动捕获外部变量i
allfun = [ (lambda a, myi=i: a+myi) for i in range(4) ]
|