如何让itertools.zip_longest的可变fillvalue生成独立dict实例?
解决itertools.zip_longest填充独立字典实例的问题
核心问题在于:itertools.zip_longest的fillvalue参数是提前创建好的单一实例,如果传入可变对象(比如dict()),所有缺值位置都会复用这个实例的引用,修改其中一个会影响所有填充项。
可行解决方案
方案1:生成器表达式动态创建新字典
用None作为临时填充值,再通过生成器表达式将每个None替换为新的空字典,确保每次缺值都生成独立实例:
from itertools import zip_longest list_a = [{"id": 1}, {"id": 2}] list_b = [{"name": "Alice"}] # 生成器版本(内存友好,适合大数据量) zip_result = ((a if a is not None else {}, b if b is not None else {}) for a, b in zip_longest(list_a, list_b, fillvalue=None)) # 验证独立性 items = list(zip_result) items[1][0]["id"] = 3 print(items[0][0]) # 输出 {'id': 1},不受后续修改影响 print(items[1][0]) # 输出 {'id': 3}
方案2:列表推导式直接生成结果列表
如果需要直接得到列表而非生成器,用列表推导式处理每个分组:
from itertools import zip_longest list_a = [{"id": 1}, {"id": 2}] list_b = [{"name": "Alice"}] # 列表推导式版本 zip_result = [tuple(item if item is not None else {} for item in group) for group in zip_longest(list_a, list_b, fillvalue=None)]
为什么之前的尝试无效?
- 直接传
fillvalue=dict():只会创建一次空字典,所有缺值位置复用同一引用。 - 传
fillvalue=copy.deepcopy(dict()):deepcopy仅在传入参数时执行一次,本质还是单一实例,无法解决复用问题。
内容的提问来源于stack exchange,提问作者Wör Du Schnaffzig
相关产品推荐
相关产品推荐

