关于python中循环创建lambda函数遇到问题的原因和解决方法

笔者在遇到此问题时是在上数值计算方法实验课的时候,由于要三次逼近某函数,所以频繁使用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是一个局部变量,只在这个循环中存在,当循环结束,变量就没有了,留下的只有数字,就不会出现以上问题了。

至此,问题的原因已经明了,解决方案也完善了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值