Python字典keys()与values()返回序列同索引元素是否存在对应关系?
问题解答
首先要明确两个基础前提:
- Python 3 中
d.keys()返回dict_keys类型视图,d.values()返回dict_values类型视图,两类视图都不支持下标索引访问,直接执行k[n]会抛出TypeError: 'dict_keys' object is not subscriptable错误。 - 如果你是先将视图转换为了列表再做索引,即代码为
k = list(d.keys())、v = list(d.values()),对应关系要分场景判断:- Python 3.7及以上版本(官方规范级保证)
字典插入顺序被正式纳入Python语言规范,keys()、values()、items()的遍历顺序完全和键的插入顺序一致,只要转换为列表期间没有修改字典结构,相同索引位置的元素必然是对应的键值对。 - Python 3.6版本(仅CPython实现保证)
CPython实现的3.6版本已经默认保留字典插入顺序,但这个特性属于实现细节,没有写进语言规范,不能保证在所有Python解释器(比如PyPy、Jython)下成立。 - Python 3.5及更早版本、Python 2.x版本
字典属于无序结构,没有固定的遍历顺序,但只要你调用keys()和values()的间隔期没有对字典做增删键的修改操作,两者的迭代顺序是严格匹配的,转成列表后相同索引位置的元素依然是对应的键值对。
- Python 3.7及以上版本(官方规范级保证)
注意:如果在获取
keys()、values()视图后修改了字典的结构(新增、删除键),视图会实时同步更新,迭代顺序可能发生变化,此时两者的元素对应关系就无法得到保证。
内容的提问来源于stack exchange,提问作者Tony Ennis
相关产品推荐
相关产品推荐

