笔者在遇到此问题时是在上数值计算方法实验课的时候,由于要三次逼近某函数,所以频繁使用lambda函数,为了方便起见,我直接选择使用for循环。
这是问题代码
l=[]
for i in range(len(list)):#逼近函数,使用y=a0*x**0+a1*x**1+a2*x**2+...的形式,list[i]是存放ai的列表
f=lambda x:list[i]*x**i
l.append(f)
for i in range(len(l)):
print(l[i](1))
f1 = l[0]
print(f1(1))
def last(x):
sum=0.0
for i in range(len(l)):
print(i,',',l[i](x))
sum+=l[i](x)
return sum
print(last(1))
except output:a0,a1,a2,a3,a0,a0+a1+a2+a3
true output:a0,a1,a2,a3,a3,4*a3
刚开始一直纳闷为什么,后来问了问老师,多亏老师才明白问题所在,当使用lambda创建此函数集时,i成为了全局变量,而在lambda函数集中的i就是使用的此全局变量,所以在第一个循环的时候可以正常输出,因为这时全局i都被改变了,但是问题就出在其他地方,比如第二段输出,此时i为3,所以即使设置为l[0]参数仍然是3,输出为a3,同样的在函数体中,i是局部变量,但是lambda函数中还是全局变量,所以输出还是有问题。
那么,该怎么解决呢?
就是要让函数集中与这种全局变量无关
改写 f=lambda x:list[i]*x**i为f=lambda x,i=i:list[i]*x**i
这样就相当于
def f(x,i=i):
return list[i]*x**i
所以,这里面使用的i是一个局部变量,只在这个循环中存在,当循环结束,变量就没有了,留下的只有数字,就不会出现以上问题了。
至此,问题的原因已经明了,解决方案也完善了。