奇怪的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最新面试题

相关推荐
_WndProc10 分钟前
【Python】Flask网页
开发语言·python·flask
互联网搬砖老肖12 分钟前
Python 中如何使用 Conda 管理版本和创建 Django 项目
python·django·conda
测试者家园23 分钟前
基于DeepSeek和crewAI构建测试用例脚本生成器
人工智能·python·测试用例·智能体·智能化测试·crewai
编程乐趣25 分钟前
自学C#,要懂得用好对象浏览器
windows·.net
大模型真好玩28 分钟前
准确率飙升!Graph RAG如何利用知识图谱提升RAG答案质量(四)——微软GraphRAG代码实战
人工智能·python·mcp
前端付豪36 分钟前
11、打造自己的 CLI 工具:从命令行到桌面效率神器
后端·python
前端付豪36 分钟前
12、用类写出更可控、更易扩展的爬虫框架🕷
后端·python
江太翁1 小时前
Pytorch torch
人工智能·pytorch·python
qq_393828221 小时前
办公文档批量打印器 Word、PPT、Excel、PDF、图片和文本,它都支持批量打印。
windows·word·powerpoint·excel·软件需求
网安INF1 小时前
深度学习中的逻辑回归:从原理到Python实现
人工智能·python·深度学习·算法·逻辑回归