Python以布尔为键存lambda函数时含sqrt的函数丢失问题
问题根因
这个现象和lambda函数中是否调用math库的sqrt方法没有任何关系,核心问题是Python字典不允许存在重复键,相同键的后续键值对会直接覆盖之前的赋值。
你的代码中bool_list = [True, False, True],和函数列表zip后生成的三组键值对依次为:
(True, func1)(False, func2)(True, func3)
当传入dict()构造字典时,第三组键值对的键True和第一组重复,会直接将第一组True对应的func1覆盖为func3,最终字典只会保留两个键值对。你误以为存储失败的func3其实已经成功存入,反而最早的func1被覆盖消失了。
验证方法
你可以新增一行调用代码验证实际存储的函数:
from math import sqrt bool_list = [True, False, True] func1 = lambda x: x ** 2 func2 = lambda x: x ** 3 func3 = lambda x: sqrt(x) func_list = [func1, func2, func3] dic = dict(zip(bool_list, func_list)) print(dic[True](4)) # 输出结果为2.0,正好是func3调用sqrt(4)的计算结果,完全可以证明func3已经成功存入字典
符合你预期的实现方案
如果你想要存储多个对应True键的函数,遍历触发所有对应函数,可以把字典的值设置为列表存储多个函数,修改逻辑如下:
from math import sqrt bool_list = [True, False, True] func1 = lambda x: x ** 2 func2 = lambda x: x ** 3 func3 = lambda x: sqrt(x) func_list = [func1, func2, func3] dic = {} for key, func in zip(bool_list, func_list): dic.setdefault(key, []).append(func) # 遍历调用所有键为True的函数 for func in dic.get(True, []): print(func(4)) # 输出依次为16、2.0
内容的提问来源于stack exchange,提问作者Kanan Mahammadli
相关产品推荐
相关产品推荐

