导航菜单

  • 1.Python介绍
  • 2.Python解释器
  • 3.安装Python
  • 4.VSCode开发Python
  • 5.print
  • 6.进制
  • 7.编码
  • 8.Unicode2UTF8
  • 9.整数类型
  • 10.字符串类型
  • 11.布尔类型
  • 12.变量与内存
  • 13.浮点类型
  • 14.注释
  • 15.if条件
  • 16.while循环
  • 17.运算符
  • 18.输入
  • 19.列表
  • 20.元组
  • 21.集合
  • 22.字典
  • 23.for循环
  • 22.1 字典是什么?
  • 22.2 创建与访问
  • 22.3 修改与删除
  • 22.4 遍历
  • 22.5 常用模式
    • 22.5.1 安全累加计数
    • 22.5.2 嵌套字典(接口 JSON 常见)
    • 22.5.3 列表转字典(按 id 索引)
    • 22.5.4 JSON ↔ dict
    • 22.5.5 浅拷贝和深拷贝
  • 22.6 项目开发要点

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"])   # B

22.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 项目开发要点 #

  1. 读可选字段用 get:避免 KeyError,如 payload.get("page", 1)
  2. 不要用 dict 当下标列表:需要按 id 查用户用 {id: user},不要反复遍历列表
  3. JSON ↔ dict:json.loads() / json.dumps() 与字典互转
  4. 合并字典:d1.update(d2) 或 Python 3.9+ 的 d1 | d2(后者键冲突时以后者为准)
  5. 浅拷贝:copy() 只复制一层,嵌套结构改内层仍可能影响原对象
  6. 不要用可变对象当键:列表、字典不能作为 key
← 上一节 21.集合 下一节 23.for循环 →

访问验证

请输入访问令牌

Token不正确,请重新输入