下面这一行代码你会觉得产生什么结果呢?
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) ]