在 Python 编程中,字典(dict) 是最核心、最高频的数据结构之一,它是 Python 中的「哈希表」实现,也是处理高速查找、键值对存储的最优解。很多初学者只知道 dict 是存键值对的,却不理解它的底层原理、使用限制和设计思想,本文就从基础定义、底层哈希、核心特性、使用禁忌到关联知识点,全方位拆解 Python 字典,让你真正吃透这个数据结构。
一、什么是 Python 字典(dict)?
字典是 Python 中唯一的内置映射型数据结构 ,采用 key: value(键值对)的形式存储数据,格式为 {key1: value1, key2: value2},和 JavaScript 的对象字面量、ES6 的 Map、Java 的 HashMap 本质是同一种设计思想。
举个最简单的例子:
python
运行
ini
# 学生信息:姓名为key,成绩为value
student = {"张三": 90, "李四": 85, "王五": 95}
我们可以直接通过键(key) 获取对应的值,不需要遍历所有数据,这也是字典最核心的优势。
为什么叫「字典」?
这个命名非常形象:我们查汉语字典时,会通过偏旁、拼音索引 直接定位到汉字,不用从第一页翻到最后一页;Python 字典也是同理,通过 key 直接定位 value,时间复杂度为 O (1) ,速度极快。
对比一下低效的替代方案:如果不用字典,用两个列表存储数据,下标一一对应:
python
运行
ini
names = ["张三", "李四", "王五"]
scores = [90, 85, 95]
想要查李四的成绩,必须遍历列表找到下标,时间复杂度 O (n),数据量越大越慢。这就是字典存在的意义。
二、底层原理:哈希表(HashTable)
Python 字典的底层,就是哈希表(HashTable) ,这是理解字典所有特性的关键。
1. 核心概念
- 哈希 :通过一个固定的哈希函数,把任意长度的 key 转换成一个固定的数字(哈希值);
- 表:一段连续的内存空间,用来存储数据;
- 哈希表:基于键值对存储,通过哈希函数计算 key 的存储位置的数据结构。
2. 工作流程
- 存入数据时,Python 对 key 执行哈希运算,得到内存地址;
- 把 value 存放到这个地址;
- 查找数据时,再次对 key 做哈希运算,直接拿到 value,无需遍历。
规则 :字典中的 key 必须是唯一的,重复 key 会覆盖旧值。
三、字典(dict)VS 列表(list):核心特性对比
这是面试和开发中必知的知识点,二者优缺点完全相反:
字典 dict
✅ 优点:查找、插入速度极快 ,不会随着 key 数量增加而变慢;❌ 缺点:占用大量内存 ,空间浪费较多,典型的空间换时间。
列表 list
✅ 优点:占用空间小,内存利用率高;❌ 缺点:查找、插入速度随元素增多变慢,时间复杂度 O (n),时间换空间。
使用场景
- 需要高速查找、快速映射 → 用字典;
- 数据有序、仅做遍历存储 → 用列表。
四、重中之重:字典的 key 必须可哈希(hashable)
这是初学者最容易踩坑的点:不是所有数据都能当字典的 key。
1. 规则
dict 的 key 必须是可哈希的 ,也就是不可变类型。
✅ 可哈希(能做 key) :数字(int/float)、字符串(str)、元组(tuple)❌ 不可哈希(不能做 key) :列表(list)、字典(dict)、集合(set)
2. 为什么必须是不可变类型?
字典依靠 key 计算 value 的存储位置:
- 如果 key 是可变类型(比如列表),内容修改后,哈希值会发生变化;
- 再次查找时,计算出的内存地址和最初不一致;
- 最终导致字典内部数据混乱,找不到对应的值。
错误示例(会直接报错):
python
运行
ini
# 列表是可变类型,不能做key
dict_data = {[1,2,3]: "测试"} # 报错:unhashable type: 'list'
五、近亲数据结构:集合(Set)
理解了字典,就能秒懂 Set,二者是「亲兄弟」。
- Set 和 dict 底层原理完全一致,都是哈希表;
- 唯一区别 :dict 存储
key: value,Set 只存 key,不存 value; - 核心特性:因为 key 不能重复,所以 Set 会自动去重。
示例:
python
运行
ini
# 集合自动去重
s = {1, 2, 2, 3}
print(s) # 输出 {1,2,3}
简单总结:Set = 没有 value 的字典。
六、延伸:不可变对象(哈希的基础)
为什么字符串、数字能做 key,列表不行?核心是可变对象 vs 不可变对象。
1. 分类
- 不可变对象:str(字符串)、int、float、tuple → 可哈希
- 可变对象:list、dict、set → 不可哈希
2. 字符串的不可变性
看这段代码:
python
运行
ini
str1 = 'abc'
new_str = str1.replace('a', 'A')
str1是变量,可以重新赋值;'abc'是字符串对象,永远不会被修改;replace()方法不会改变原对象,只会返回一个新字符串Abc。
结论:不可变对象调用任何方法,都不会修改自身,这是它能被安全哈希的原因。
七、补充知识点:声明优先级(JS 关联)
最后补充一个跨语言知识点:在 JavaScript 中,变量提升时,函数声明优先级高于变量声明 ;如果定义多个同名函数,最后一个函数会覆盖前面的所有函数。这和 Python 字典中「后赋值的 key 覆盖前值」的逻辑是相通的。
八、总结
- Python 字典是哈希表实现,O (1) 高速查找,对应生活中的查字典;
- 空间换时间:速度快但占用内存大,和列表优缺点互补;
- key 必须不可变(可哈希) :list/dict/set 不能做 key,避免哈希混乱;
- Set 是无 value 的字典,自动去重,底层原理完全一致;
- 不可变对象(str / 数字 / 元组)是哈希的基础,可变对象无法哈希。
字典是 Python 最强大的数据结构之一,吃透它的原理和规则,无论是日常开发、算法刷题还是面试,都能游刃有余!