dict.get(key, default=None) 是字典安全取值的核心方法:鍵存在回傳值,不存在回傳預設值 (預設 None),永不拋出 KeyError。
d = {'Name': 'Zara', 'Age': 27}
print(d.get('Age')) # 27
print(d.get('Sex')) # None
print(d.get('Sex', 'Never')) # 'Never' (自訂預設值)
# 對比:直接索引
# print(d['Sex']) # KeyError: 'Sex'
# 累加計數
counts = {}
for word in ['apple', 'banana', 'apple']:
counts[word] = counts.get(word, 0) + 1
print(counts) # {'apple': 2, 'banana': 1}
# 建立列表分組
groups = {}
for item in data:
groups.setdefault(item.category, []).append(item)
# 或用 get + 列表推導 (較不直觀)
def connect(host, config=None):
config = config or {}
timeout = config.get('timeout', 30)
retries = config.get('retries', 3)
ssl = config.get('ssl', True)
# ...
# 冗長
value = d['key'] if 'key' in d else default
# 簡潔
value = d.get('key', default)
| 方法 | 鍵存在 | 鍵不存在 | 修改字典 |
|---|---|---|---|
d[key] | 回傳值 | KeyError | 否 |
d.get(key) | 回傳值 | None | 否 |
d.get(key, def) | 回傳值 | 回傳 def | 否 |
d.setdefault(key, def) | 回傳值 | 設定鍵=def,回傳 def | 是 |
# get: 預設值由呼叫端決定,字典不變
d = {'a': 1}
print(d.get('b', 0)) # 0
print(d) # {'a': 1}
# setdefault: 預設值寫入字典
d = {'a': 1}
print(d.setdefault('b', 0)) # 0
print(d) # {'a': 1, 'b': 0}
get 為 C 層實現,極快,熱點路徑首選'key' in d and d['key'] 雙重查找
# 錯誤:共享同一列表
d.get('key', []).append(1)
# 正確:每次新建
d.get('key', []).append(1) # 但這裡 append 後列表即丟棄
# 真正需求用 setdefault 或 defaultdict
from collections import defaultdict
d = defaultdict(list)
d['key'].append(1)
def deep_get(d, *keys, default=None):
"""安全取得巢狀字典值: deep_get(d, 'a', 'b', 'c')"""
for k in keys:
if isinstance(d, dict):
d = d.get(k)
else:
return default
return d if d is not None else default
data = {'user': {'profile': {'name': 'Alice'}}}
print(deep_get(data, 'user', 'profile', 'name')) # 'Alice'
print(deep_get(data, 'user', 'settings', 'theme')) # None
get() 是字典操作的「瑞士刀」,善用預設值模式能大幅減少防禦性程式碼。