Python中不同插入顺序的dict.keys()比较为何返回True?
为什么插入顺序不同的字典,直接比较
dict.keys()会返回True 核心原因是dict.keys()返回的不是列表这类序列对象,而是字典键视图对象(dict_keys),它的相等判断规则和集合一致:仅校验两个视图包含的键是否完全重合,完全不考虑键的插入顺序。
测试代码结果说明
你运行的测试代码结果完全符合这个设计逻辑:
d1 = {1:2, 2:3, 3:4} d2 = {3:5, 2:6, 1:7} print(d1.keys() == d2.keys()) # True,两个字典的键都是{1,2,3},集合完全匹配 print(list(d1.keys()) == list(d2.keys())) # False,转成列表后会保留插入顺序,d1键顺序为[1,2,3]、d2为[3,2,1],顺序不一致
旧版本Python的行为一致性
这个判断结果和字典是否保留插入顺序没有关联,在Python 3.0到3.5这些字典默认不保留插入顺序的版本中,dict.keys()的相等判断逻辑完全一致:只要两个字典的键集合完全相同,比较结果就为True。
本质上dict_keys视图从Python3推出之初,就没有把顺序作为相等判断的依据,这个行为和字典本身的相等逻辑是统一的:字典本身做相等比较时,也仅校验所有键值对是否匹配,不会校验插入顺序。你可以把d1.keys() == d2.keys()的判断逻辑近似理解为set(d1.keys()) == set(d2.keys()),这类集合判断本身就和元素顺序无关。
只有当你把键视图显式转换为列表、元组这类有序序列类型时,元素顺序才会参与相等比较。
内容的提问来源于stack exchange,提问作者foosion
相关产品推荐
相关产品推荐

