
字典dictPython中的字典dict里面存储的是键值对key:value类型的数据可以根据键key找到对应的值value。键值对类型的数据在不同的编程语言中是有差异的在Python中叫做字典dict在其它的编程语言当中有的叫映射map有的叫哈希表hash。特点键值对key:value存储键key不能重复、可修改。注意字典dict中的value可以是任何类型的数据而key不能为可变类型。# 定义空字典字典名称 {}字典名称 dict()# 定义字典 dict1 {王林:670, 李慕婉:608, 徐立国:580, 韩立:688} print(dict1) # {王林: 670, 李慕婉: 608, 徐立国: 580, 韩立: 688} print(type(dict1)) # key不能重复如果重复后面的值会覆盖前面的值 dict2 {王林:670, 李慕婉:608, 徐立国:580, 韩立:688,王林:700} print(dict2) # {王林: 700, 李慕婉: 608, 徐立国: 580, 韩立: 688} print(type(dict2)) # key必须是不可变类型str, int, float, tuple不能是list, set, dict dict3 {0:670, 1.5:608, (1,2):580, 3:688} # {0: 670, 1.5: 608, (1, 2): 580, 3: 688} print(dict3) dict4 {0:670, 1.5:608, (1,2):580, [A, B]:688} print(dict4) # TypeError: unhashable type: list # 访问 print(dict1[李慕婉]) # 获取 608 dict1[李慕婉] 688 # 字典是可以修改的 print(dict1) # {王林: 670, 李慕婉: 688, 徐立国: 580, 韩立: 688}字典的注意事项value可以是任意类型而key必须是不可变类型不能为list、set、dict字典内的key不允许重复如果重复定义后面的覆盖前面的字典是没有索引下标的不能根据索引获取值只可以根据key获取value难点1. python中为什么说字典dict是可变类型数据字典是可变类型意思就是创建之后还能随便改里面的内容增/删/改而且不用新建一个字典代码证明字典为什么是可变的咱们直接看改完之后地址没变 可变类型# 1. 创建一个字典 person {name: 小明, age: 18} # 打印看看它的“身份证”内存地址 print(修改前地址, id(person)) # 比如1698499964032 # 2. 直接修改字典里的内容不用重新赋值 person[age] 20 # 改年龄 person[gender] 男 # 加内容 # 3. 再看地址 print(修改后地址, id(person)) # 还是 1698499964032结论内容随便改但字典本身没变 → 这就是可变类型再对比不可变类型一看就懂区别# 字符串不可变 a hello print(id(a)) # 地址1 a a world print(id(a)) # 地址变了2. 那为什么又说字典dict里的key不能为可变类型一、先记住核心结论字典的 key 必须是不可变类型比如字符串、数字、元组不能是可变类型比如列表、字典本身。原因只有一句话字典要靠 key 的「身份证号」来快速查找内容可变类型的身份证号会变字典就找不到它了二、用生活例子理解你可以把字典想象成一个快递柜快递柜的格子号key必须是固定不变的比如 101、102这样快递员和你才能找到格子。如果格子号会变比如今天叫 101明天变成 102那你永远找不到自己的快递了Python 里也是一样不可变类型字符串、数字、元组就像固定的格子号它的「哈希值身份证号」永远不变字典能一直找到它。可变类型列表、字典就像会变的格子号它的哈希值会变字典就彻底找不到它了。三、代码演示一看就懂1. 用不可变类型当 key完全没问题# 用字符串不可变当key student {name: 王林, age: 20} print(student[name]) # 输出王林字典能稳稳找到2. 用可变类型当 key直接报错# 用列表可变当key会报错 student {[name]: 王林} # 运行会报错TypeError: unhashable type: list报错的原因就是列表是可变类型没有固定的哈希值字典没法用它当“格子号”。四、再讲透底层逻辑不用背理解就行字典的查找原理是给 key 算一个哈希值固定的数字相当于给它发个身份证。用这个哈希值来定位数据的位置查找速度特别快。如果 key 是可变类型比如列表你修改了列表里的内容它的哈希值就变了。等你再想用这个 key 找数据时字典用新的哈希值去查根本找不到原来的位置数据就丢了五、总结字典本身是可变的因为它的“格子”里的东西可以随便换不影响格子号本身。字典的 key 不能是可变的因为 key 就是“格子号”号必须固定不然找不到东西。3. 那么说字典为可变类型和字典里的key不能为可变类型有没有什么理解上的矛盾呢完全没有矛盾这其实是两个完全独立的概念我用大白话给你掰开讲清楚保证一看就懂。一、一句话说清两者的区别字典本身是可变的指的是「字典这个大容器」里的内容可以随便增删改。字典的 key 不能是可变的指的是「字典里用来当标签的 key」必须固定不变这样才能找到东西。就像一个文件柜柜子本身是“可变的”你可以往柜子里加文件、拿走文件、修改文件内容柜子还是那个柜子。但每个抽屉的**标签key**必须是固定的比如“语文资料”“数学资料”不能今天写“语文”明天改成“英语”不然你永远找不到文件。二、用代码对比一眼看出区别1. 字典本身可变容器可改# 定义一个字典文件柜 student {name: 王林, age: 18} # 1. 改内容往柜子里改文件 student[age] 19 # 2. 加内容往柜子里加新文件 student[gender] 男 # 3. 删内容从柜子里拿走文件 del student[gender] print(student) # 输出{name: 王林, age: 19} # 你看字典本身没变只是里面的内容被修改了2. key 必须不可变标签不能变# 用列表当key标签是可变的不行 try: bad_dict {[name]: 王林} # 报错TypeError: unhashable type: list except TypeError as e: print(报错原因, e) # 用字符串当key标签是固定的没问题 good_dict {name: 王林} print(good_dict[name]) # 输出王林稳稳找到三、总结字典可变是容器的特性内容可改。key 不可变是标签的要求必须固定。两者一个说“柜子”一个说“抽屉标签”完全不冲突练习判断题对的打 ✅错的打 ❌字典是可变类型所以字典里的所有元素包括 key 和 value都可以随便改。我可以用 [1, 2, 3] 这个列表当字典的 key。我可以用 (1, 2, [3, 4]) 这个元组当字典的 key。我可以用 {name: 王林} 这个字典当另一个字典的 key。我修改了字典里的 value这个字典的内存地址会发生变化。判断题答案❌ 解析字典本身是可变的但key 必须是不可变类型不是所有元素都能随便当 key。❌ 解析列表是可变类型不能当字典的 key。❌ 解析元组本身是不可变的但如果元组里包含了可变类型比如列表它整体也不能当 key。❌ 解析字典是可变类型不能当另一个字典的 key。❌ 解析修改字典里的 value 属于 “原地修改”字典本身还是同一个对象内存地址不会变。声明本篇学习笔记参考黑马程序员相关课程部分素材来源于网络公开资料及本人补充文中为个人整理复盘仅供学习交流使用。