Python - lambda 的使用注意

目录

零、lambda 基础学习

一、匿名函数中的变量绑定

1-1 变量绑定问题描述 - 函数中的变量在执行时绑定

1-2 实现函数内变量在定义时绑定 - 绑定最初的值

1-3 由于绑定问题导致的迭代错误


零、lambda 基础学习

Python - 生成式、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))

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/89238293