Python中字典推导式生成Lambda函数异常及解决方法咨询
解决Lambda函数字典推导式的问题
你的问题出在lambda捕获的是循环变量的引用,而非当前迭代的值——字典推导式结束后,所有lambda里的value都会指向循环最后一次的结果(也就是d里最后一个键对应的值),所以调用时结果都一样。下面是几种可行的解决办法:
方法一:利用默认参数绑定当前值
默认参数会在函数定义时就完成求值,把当前的value绑定到lambda的默认参数上:
d = {'key1': 1, 'key2': 2} functions = {key: (lambda x, v=value: v*x) for key, value in d.items()}
测试验证:
print(functions['key1'](3)) # 输出3 print(functions['key2'](3)) # 输出6
方法二:使用functools.partial绑定参数
用functools.partial把乘法操作和当前value预先绑定,避免闭包引用问题:
from functools import partial from operator import mul d = {'key1': 1, 'key2': 2} functions = {key: partial(mul, value) for key, value in d.items()}
mul是Python内置的乘法函数,partial(mul, value)会返回一个新函数,调用时只需要传入另一个乘数即可。
方法三:用工厂函数生成lambda
写一个简单的工厂函数,每次调用时把当前value作为参数传入,形成独立的闭包环境:
def make_multiplier(value): return lambda x: value * x d = {'key1': 1, 'key2': 2} functions = {key: make_multiplier(value) for key, value in d.items()}
工厂函数每次执行都会创建一个新的作用域,确保每个lambda捕获的是当前作用域里的value值。
内容的提问来源于stack exchange,提问作者student7481
相关产品推荐
相关产品推荐

