22.1 字典是什么? #
字典存储键值对(key: value),通过键快速取值。项目里几乎无处不在:JSON、配置、ORM 行、请求体都是字典结构。
user = {
"id": 1,
"name": "Alice",
"active": True,
}- 键:不可变且唯一(常用字符串、数字)
- 值:任意类型
- Python 3.7+ 会保持插入顺序
22.2 创建与访问 #
empty = {}
person = {"name": "Bob", "age": 25}
# 直接访问:键不存在会 KeyError
print(person["name"])
# get:更安全,可设默认值
print(person.get("email")) # None
print(person.get("email", "")) # ""22.3 修改与删除 #
person = {"name": "Bob", "age": 25}
person["age"] = 26 # 改已有键
person["city"] = "Beijing" # 新增键
person.update({"job": "dev"}) # 批量更新
print(person)
person2 = {"salary": 10000}
print(person | person2) # 合并字典
del person["city"] # 删除键
role = person.pop("job", None) # 删除并返回值,无键时返回 None
print(role)22.4 遍历 #
person = {"name": "Bob", "age": 25}
for key, value in person.items():
print(key, value)
for key in person: # 默认遍历键
print(key)
if "name" in person:
print("有 name 字段")22.5 常用模式 #
22.5.1 安全累加计数 #
word_count = {}
for word in ["apple", "banana", "apple"]:
word_count[word] = word_count.get(word, 0) + 1
print(word_count)
# {'apple': 2, 'banana': 1}22.5.2 嵌套字典(接口 JSON 常见) #
response = {
"code": 200,
"data": {"user_id": 10, "name": "Alice"},
}
print(response["data"]["user_id"])22.5.3 列表转字典(按 id 索引) #
users = [{"id": 1, "name": "A"}, {"id": 2, "name": "B"}]
by_id = {u["id"]: u for u in users}
print(by_id[2]["name"]) # B22.5.4 JSON ↔ dict #
json.dumps 可把字典转成 JSON 字符串,json.loads 可把 JSON 字符串还原成字典
import json
# dict 转 JSON 字符串
d = {"name": "Tom", "age": 20}
s = json.dumps(d)
print(s) # '{"name": "Tom", "age": 20}'
# JSON 字符串转 dict
d2 = json.loads(s)
print(d2) # {'name': 'Tom', 'age': 20}22.5.5 浅拷贝和深拷贝 #
有些情况下你希望复制一个字典(或其他容器),并独立修改副本不影响原对象。这时用到拷贝,分为:
- 浅拷贝(shallow copy):只复制最外层对象,内部嵌套对象仍是同一个引用。
- 深拷贝(deep copy):递归复制所有层级内容,完全独立。
浅拷贝
import copy
d1 = {"a": 1, "b": [2, 3]}
d2 = d1.copy() # 或 copy.copy(d1)
d2["b"].append(4)
print(d1) # {'a': 1, 'b': [2, 3, 4]}
print(d2) # {'a': 1, 'b': [2, 3, 4]}
# 可以看到内层列表被两者共享,浅拷贝只复制最外层深拷贝
import copy
d1 = {"a": 1, "b": [2, 3]}
d2 = copy.deepcopy(d1)
d2["b"].append(4)
print(d1) # {'a': 1, 'b': [2, 3]}
print(d2) # {'a': 1, 'b': [2, 3, 4]}
# 深拷贝后修改副本不会影响原始对象总结:
- 简单字典用 copy() 做浅拷贝。
- 包含嵌套结构(如列表、字典等)要独立副本用 deepcopy()。
22.6 项目开发要点 #
- 读可选字段用
get:避免KeyError,如payload.get("page", 1) - 不要用
dict当下标列表:需要按 id 查用户用{id: user},不要反复遍历列表 - JSON ↔ dict:
json.loads()/json.dumps()与字典互转 - 合并字典:
d1.update(d2)或 Python 3.9+ 的d1 | d2(后者键冲突时以后者为准) - 浅拷贝:
copy()只复制一层,嵌套结构改内层仍可能影响原对象 - 不要用可变对象当键:列表、字典不能作为 key