如何用无参lambda函数包装任意长度列表的每个元素?
解决Python中创建lambda列表返回对应数组元素的问题
首先得搞清楚为什么 B = [lambda: element for element in A] 不能正常工作——这是因为Python的闭包采用延迟绑定,lambda函数里的element变量并不会在定义时就捕获当前循环的值,而是在lambda被调用的时候才去查找element的最终值,也就是循环结束后element指向的最后一个元素。
接下来给你几种可行的解决办法:
方法1:利用默认参数捕获当前值
在定义lambda的时候,把当前的element作为默认参数传入,这样参数会在定义时就绑定当前的值,而不是延迟到调用时查找:
A = [1, 2, 3, 4] B = [lambda x=element: x for element in A] # 测试一下 print(B[0]()) # 输出1 print(B[1]()) # 输出2
方法2:使用functools.partial
functools.partial可以帮我们预先绑定函数的参数,避免闭包延迟绑定的问题:
from functools import partial def get_value(x): return x A = [1, 2, 3, 4] B = [partial(get_value, element) for element in A] # 测试 print(B[0]()) # 输出1 print(B[2]()) # 输出3
方法3:创建嵌套函数来捕获值
可以写一个小的辅助函数,每次调用时返回绑定了当前值的lambda:
def create_lambda(val): return lambda: val A = [1, 2, 3, 4] B = [create_lambda(element) for element in A] # 测试 print(B[3]()) # 输出4
这几种方法都能解决问题,其中方法1是最简洁的写法,方法3的可读性最好,根据你的场景选择就行。
内容的提问来源于stack exchange,提问作者crysoberil
相关产品推荐
相关产品推荐

