在Python中,dict.get(key, default)
方法的默认参数(default
)可以用于返回复杂数据结构(如嵌套字典、列表、自定义对象等),但需要注意其惰性求值和引用共享的特性。以下是详细说明和解决方案:
dict.get()
的默认参数在键不存在时返回该值,但需注意:
[]
或{}
),多次调用可能共享同一引用。data = {}
default_value = {"nested": []} # 可变对象
# 多次调用会共享同一个default_value的引用
result1 = data.get("key1", default_value)
result1["nested"].append(1) # 修改会影响后续调用
result2 = data.get("key2", default_value)
print(result2) # {"nested": [1]},预期应为{"nested": []}
dict.setdefault()
data = {}
result = data.setdefault("key", {"nested": []}) # 若key不存在,创建并返回新对象
result["nested"].append(1)
collections.defaultdict
from collections import defaultdict
data = defaultdict(lambda: {"nested": []})
result = data["key"] # 自动生成新对象
result["nested"].append(1)
data = {}
result = data.get("key", {"nested": []}.copy()) # 每次创建新对象
result["nested"].append(1)
or
运算符data = {}
result = data.get("key") or {"nested": []} # 若key为None/不存在,生成新对象
result["nested"].append(1)
KeyError
。None
、tuple
),无需担心引用问题。def get_complex_value(data, key):
return data.get(key, {"nested": [], "config": {"enabled": False}})
data = {}
result = get_complex_value(data, "user_settings")
result["nested"].append("new_item")
print(result) # {"nested": ["new_item"], "config": {"enabled": False}}
通过上述方法,可安全地将复杂数据作为dict.get()
的默认参数使用。
没有搜到相关的文章