Python - lambda 的使用注意
目录
零、lambda 基础学习
一、匿名函数中的变量绑定
!!!!注意!!!
在业务逻辑和生产过程中,严重不建议使用 lambda!因为存在变量绑定问题导致数据误差!
1-1 变量绑定问题描述 - 函数中的变量在执行时绑定
x = 10 a = lambda y: x + y x = 20 b = lambda y: x + y print(a(10)) # 30 print(a(10)) # 30
lambda 表达式中使用的 x ,一个自由变量,那么该值只有在运行时进行绑定,而非我们想象中的在定义时绑定。在运行时绑定会将最终的值进行传递。
x = 10 a = lambda y: x + y print(a(10)) # 20 x = 20 b = lambda y: x + y print(b(10)) # 30
1-2 实现函数内变量在定义时绑定 - 绑定最初的值
x = 10 a = lambda y, x=x: x + y x = 20 b = lambda y, x=x: x + y print(a(10)) # 20 print(b(10)) # 30
将 x 赋予默认值,则可以将 x=x 作为一个暂时性的常量。
1-3 由于绑定问题导致的迭代错误
funcs = [lambda x:x+n for n in range(5)] for f in funcs: print(f(0))
问题原因: lambda 函数内绑定的 n 变量为 for 循环迭代的最后一个值。
解决方式:将 lambda 函数内绑定的变量变成暂时常量。
funcs = [lambda x, n=n: x + n for n in range(5)] for f in funcs: print(f(0))