奇怪的Python:为何 list 和 dict 的元素顺序从 Python 3.7 开始保持插入顺序?

你好!我是老邓,你的 Python 导师。今天我们来聊聊 Python 3.7 后 list 和 dict 元素顺序保持插入顺序的特性。

1、问题简介

在 Python 3.7 之前,list 的元素顺序虽然通常与插入顺序一致,但官方文档并没有做出保证。dict 的元素顺序则完全是随机的。

从 Python 3.7 开始,官方正式将"维护插入顺序"作为 list 和 dict 的一个语言特性。这意味着,元素的迭代顺序将始终与其插入顺序相同。

2、想象一下,你正在处理用户提交的调查问卷。问卷中有多个问题,每个问题的答案都存储在一个 list 中。

在 Python 3.6 中,你无法保证处理答案的顺序与用户填写顺序一致,这可能导致数据分析出现偏差。

又例如,你需要记录用户访问网站的页面顺序,使用 dict 存储页面和访问时间。在 Python 3.6 中,dict 的无序性使得你无法直接获取用户访问的页面顺序。

3、原因和解决方案

Python 3.7 中的这一改变源于对 dict 内部实现的优化。新的实现使用了一种更紧凑的哈希表结构,并保留了插入顺序。

这不仅提高了 dict 的性能,也带来了维护插入顺序的特性。对于 list 来说,维持插入顺序一直是其实现的一部分,只是在 3.7 版本才正式写入规范。

如果你需要在 Python 3.6 或更早版本中维护 list 或 dict 的插入顺序,可以使用 collections 模块中的 OrderedDict (对于 dict) 和 list 自身 (对于 list,虽然未保证但通常保持顺序,必要时可以自行记录插入顺序)。

4、代码示例

示例 1: Python 3.6 中的 dict

复制代码
复制代码
# Python 3.6
my_dict = {}
my_dict["apple"] = 1
my_dict["banana"] = 2
my_dict["orange"] = 3

for key, value in my_dict.items():
    print(f"{key}: {value}")

输出结果(Python 3.6版本下,每次运行结果可能不同):

复制代码
复制代码
orange: 3
apple: 1
banana: 2

示例 2: Python 3.7+ 中的 dict

复制代码
复制代码
# Python 3.7+
my_dict = {}
my_dict["apple"] = 1
my_dict["banana"] = 2
my_dict["orange"] = 3

for key, value in my_dict.items():
    print(f"{key}: {value}")

输出结果:

复制代码
复制代码
apple: 1
banana: 2
orange: 3

示例 3: Python 3.6 中使用 OrderedDict

复制代码
复制代码
# Python 3.6
from collections import OrderedDict

ordered_dict = OrderedDict()
ordered_dict["apple"] = 1
ordered_dict["banana"] = 2
ordered_dict["orange"] = 3

for key, value in ordered_dict.items():
    print(f"{key}: {value}")

输出结果:

复制代码
apple: 1
banana: 2
orange: 3

示例 4: list 的顺序保持

复制代码
复制代码
# Python 3.7+ (3.6也通常如此,但非规范)
my_list = []
my_list.append("apple")
my_list.append("banana")
my_list.append("orange")

for item in my_list:
    print(item)

输出结果:

复制代码
复制代码
apple
banana
orange

5、总结

Python 3.7 及以后版本保证了 list 和 dict 的插入顺序。这使得代码更加可预测,也简化了对顺序敏感的操作。如果你需要在早期版本中实现类似的功能,可以使用 collections.OrderedDict。

记住,理解语言的特性对于编写高效、可靠的代码至关重要。希望今天的讲解能够帮助你更好地理解 Python 中的这个重要特性。

全套Python学习资料分享:

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

三、python入门资料大全

四、python进阶资料大全

五、python爬虫专栏

六、入门学习视频全套

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

七、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

八、python最新面试题

相关推荐
weixin_3077791338 分钟前
AWS Lambda解压缩S3 ZIP文件流程
python·算法·云计算·aws
独行soc8 小时前
2025年渗透测试面试题总结-18(题目+回答)
android·python·科技·面试·职场和发展·渗透测试
S01d13r9 小时前
gunicorn + flask 处理高并发请求
python·flask·gunicorn
杜子不疼.9 小时前
《Python列表和元组:从入门到花式操作指南》
开发语言·python
pan0c239 小时前
数据处理与统计分析 —— numpy入门
python·numpy
max5006009 小时前
基于桥梁三维模型的无人机检测路径规划系统设计与实现
前端·javascript·python·算法·无人机·easyui
秋氘渔10 小时前
综合案例:Python 函数知识整合 — 学生成绩管理系统
开发语言·python
AI 嗯啦11 小时前
SQL详细语法教程(三)mysql的函数知识
android·开发语言·数据库·python·sql·mysql
databook11 小时前
把数学对象画出来:Manim Mobject类库速查手册
python·数学·动效
图灵学术计算机论文辅导11 小时前
傅里叶变换+attention机制,深耕深度学习领域
人工智能·python·深度学习·计算机网络·考研·机器学习·计算机视觉