dict.get()可避免KeyError,键不存在时返回None或指定默认值,不修改原字典;但无法区分“键不存在”与“键存在且值为None”,强契约场景应优先用方括号加错误处理。

用 dict.get() 替代方括号取值,避免 KeyError
直接用 my_dict['missing_key'] 会抛出 KeyError;而 my_dict.get('missing_key') 默认返回 None,不报错。这是最常用、最轻量的容错方式。
- 默认行为:
get()在键不存在时返回None,不是0、空字符串或假值——这点常被误以为“没传默认值就返回空” - 显式设默认值:
my_dict.get('key', 'default'),第二个参数可以是任意类型(0、[]、{}都行) - 注意:如果字典里某个键对应值本身就是
None,get('key')也会返回None,无法区分“键不存在”和“键存在但值为None”
get() 的默认值不是“兜底”,而是“键不存在时才生效”
很多人误以为 get() 会把默认值写进字典,或者影响后续操作——其实它完全只读,不修改原字典,也不触发任何副作用。
- 常见错误:写成
my_dict.get('key', []).append(item),结果报AttributeError——因为.append()是对返回值调用,而get()返回的是新列表(或None),不是字典里的对象 - 正确做法:需要可变默认值时,先取再判断,比如
lst = my_dict.get('key', []); lst.append(item),或用setdefault() - 性能上:
get()比in判断 + 取值略快一点,但差距微乎其微;别为了这点性能牺牲可读性
什么时候不该用 get()?
不是所有“怕 KeyError”的场景都适合 get()。它掩盖了缺失意图,可能让 bug 更隐蔽。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 配置加载、API 响应解析等强契约场景:键必须存在,此时应该用方括号并配合明确错误处理,而不是静默返回默认值
- 需要区分“未设置”和“设为空”的业务逻辑(比如用户头像字段:
None表示未上传,''表示已清空),get()无法满足 - 嵌套字典取值(如
d['a']['b']['c']):单层get()不够,得链式调用或用第三方库(如dict.get('a', {}).get('b', {}).get('c')),但容易冗长
替代方案:setdefault() 和 defaultdict
当你要“取值 + 同时确保键存在”,get() 就不够用了,得换更主动的工具。
立即学习“Python免费学习笔记(深入)”;
-
setdefault(key, default):如果键不存在,插入key: default并返回default;存在则返回当前值——注意它会修改原字典 -
defaultdict:适合初始化大量同类型子结构,比如dd = defaultdict(list),之后dd['new_key'].append(1)不会报错 - 注意:
defaultdict对in判断有影响——访问不存在的键会触发默认工厂函数,同时该键被加入字典,这在某些缓存或校验逻辑里是陷阱
get() 是最常用的防御手段,但它的“静默”特性是一把双刃剑。真正难的不是怎么写,而是想清楚:这个键“理应存在”还是“允许缺失”,以及“返回默认值”是否符合业务语义。

















