为何Python字典中Lambda会覆盖函数?代码异常排查
Python字典推导式中Lambda的延迟绑定问题
你遇到的问题是Python中lambda的延迟绑定特性导致的。
先看代码里的关键部分:
F2S = { **{key: lambda: value() for key, value in F1S.items()}, }
在这个字典推导式里,lambda表达式并没有在循环的每一步捕获当前的value值,而是会在lambda被调用时才去查找value的当前值。当循环结束后,value变量最后指向F1S中的最后一个元素(也就是two函数),所以不管调用F2S[1]()还是F2S[2](),最终都会执行two(),返回"TWO"。
修复方法
要让lambda在循环时就捕获当前的value,可以通过给lambda添加默认参数实现——默认参数的值会在定义lambda时就确定:
F2S = { **{key: lambda v=value: v() for key, value in F1S.items()}, }
这里给lambda设置默认参数v=value,循环的每一步中,v都会绑定为当前迭代的value,后续调用lambda时,就会使用当时捕获的函数,而非最后一个value。
另外,也可以用functools.partial绑定参数,效果一致:
from functools import partial F2S = { **{key: partial(lambda f: f(), value) for key, value in F1S.items()}, }
修复后运行代码,F2S[1]()会返回"ONE",F2S[2]()返回"TWO",断言可以正常通过。
内容的提问来源于stack exchange,提问作者danielmoessner
相关产品推荐
相关产品推荐

