
字典键不存在时,直接用 dict[key] 会抛出 KeyError。安全访问推荐用 .get() 或 .setdefault(),但二者用途和行为不同:前者只读不改字典,后者会写入默认值并返回它。
get():安全读取,不改变原字典
.get(key, default) 在键存在时返回对应值;不存在时返回 default(未提供则返回 None),且不会修改字典内容。
- 适合“查一下,有就用,没有就算了”的场景
- 多次调用不会产生副作用
- 例:
d = {'a': 1}; d.get('b', 0)返回0,d仍是{'a': 1}
setdefault():读+写,仅在键缺失时设默认值
.setdefault(key, default) 如果键存在,返回当前值;如果不存在,将 key: default 插入字典,并返回 default。
- 适合“确保某个键存在,并获取其值”的初始化逻辑
- 常用于分组、计数、缓存等需首次赋值的场景
- 例:
d = {'a': 1}; d.setdefault('b', [])返回空列表,同时d变为{'a': 1, 'b': []}
常见误用与注意事项
别把 setdefault 当成“带默认值的 get”来反复调用——它每次缺失都会插入,可能意外污染字典。
立即学习“Python免费学习笔记(深入)”;
- 想避免重复创建默认对象(如 list/dict),应确保
default是轻量或已预创建的值 -
get()的default是每次调用都重新求值;setdefault()的default也一样,但仅在插入时用一次 - 若默认值需动态生成(如时间戳、随机数),建议先计算再传入,或改用
if key not in d: d[key] = ...
替代方案:defaultdict 更适合批量初始化
当大量键都需要同一类默认值(如全部是列表、整数、集合),collections.defaultdict 比反复调用 setdefault 更简洁高效。
- 例:
from collections import defaultdict; d = defaultdict(list),之后d['x'].append(1)自动创建空列表 - 注意:
defaultdict会在首次访问缺失键时自动插入,行为类似setdefault,但更底层、更统一










