Python字典比较判为不等但双向键差集为空的原因排查
问题根因
Python原生字典的==判断逻辑分两步:
- 首先比对两个字典的键集合是否完全一致
- 键集合完全匹配的前提下,逐键比对对应value的相等性,任意一组value不相等则整体返回
False
你写的双向差集代码,仅能排查「单侧字典存在独有键」的场景,现在两个差集返回空字典,只能证明两个字典的键完全重合,根本没有校验同key下的value是否相等,自然会出现差集为空但字典判定不等的情况。
排查步骤
- 第一步先定位所有值不匹配的键,直接运行以下代码即可输出所有差异项:
value_mismatch = [] for common_key in loadedAgreement: val_loaded = loadedAgreement[common_key] val_db = latestDBAgreement[common_key] if val_loaded != val_db: value_mismatch.append( { "key": common_key, "loadedAgreement_value": val_loaded, "latestDBAgreement_value": val_db } )
运行后value_mismatch里的内容就是导致字典不等的直接原因。
- 重点排查易忽略的值差异场景:
- 类型不匹配:同key下一个是整型
1、一个是字符串"1",一个是None、一个是空字符串/0/空列表,打印输出视觉上无差异但类型不同,相等判断直接返回False - 浮点数精度误差:比如一个值是
2.0,另一个是计算得到的1.9999999999999996,肉眼看都是2但实际不等 - 嵌套结构差异:如果value包含嵌套字典、列表、元组,原生
==会递归校验内部内容,表层键一致不代表嵌套层内容一致,嵌套结构推荐直接用deepdiff库做深度比对,可直接输出各层级的差异点 - 自定义对象逻辑问题:如果value是自定义类实例、ORM模型对象、特殊时间类型对象,需要确认对应类的
__eq__方法实现是否符合预期,部分第三方类的__eq__默认做内存地址比对,即使属性完全相同也会判定不等
- 类型不匹配:同key下一个是整型
内容的提问来源于stack exchange,提问作者gene b.
相关产品推荐
相关产品推荐

