核心要点

  • 掌握 {}、dict() 多种构造方式

  • 知道键的要求(可哈希)与 dict 保序(3.7+)

  • 熟悉常用操作:get、setdefault、update、推导式

简要回答

dict 用 {}dict() 创建,键须可哈希;Python 3.7+ 保持插入顺序;支持推导式与 fromkeys 等工厂方法。

标准回答

创建方式

python
d1 = {"a": 1, "b": 2}
d2 = dict(a=1, b=2)
d3 = dict([("a", 1), ("b", 2)])
d4 = {x: x**2 for x in range(5)}  # 推导式
d5 = dict.fromkeys(["a", "b"], 0)

键约束:可哈希且不可变——strinttuple(元素可哈希)等。

常用 API

  • d.get(k, default) 安全取值
  • d.setdefault(k, default)
  • d.update(other) / d | other(3.9+ 合并)
  • d.keys() / values() / items()

顺序:3.7+ 官方保证插入顺序;3.6 CPython 已实现。

应用:配置映射、计数(collections.Counter)、JSON 解析 json.loads → dict。

常见误区

⚠️ 常见踩坑

用 list 等不可哈希对象作键会抛 TypeError: unhashable type;用 d[k] 取不存在的键抛 KeyError,需要默认值时用 d.get(k) 或 d.setdefault。另外 dict.fromkeys(keys, []) 让所有键共享同一个 list,改一个会全变——可变默认值应改用 defaultdict(list)。

追问

追问 1dict.get 和 dict[key] 有什么区别?

d[key] 键不存在时抛 KeyError;d.get(key) 返回 None(或第二参数指定的默认值)不报错。需要「缺失即报错」用 [],需要安全取值或带默认用 get。注意 get 的默认值每次都会求值,别在里面放昂贵调用。

追问 2defaultdict 解决什么问题?

collections.defaultdict(factory) 在访问不存在的键时自动调用 factory 生成默认值,免去每次 if k not in d 的判断。如 defaultdict(list) 做分组、defaultdict(int) 做计数。注意:仅读取也会创建键,可能意外膨胀字典;纯计数更推荐 Counter

追问 3如何合并两个字典?

Python 3.9+ 用 d1 | d2(返回新 dict)或 d1 |= d2(原地更新);旧版用 {d1, d2}d1.update(d2)。键冲突时一律以右侧/后者为准。这些都是浅合并,嵌套子字典不会递归合并。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。