如何为内层字典键创建新list/set对象 避免重复更新同一对象
问题根源
你代码中的t列表在定义时就已经创建了两个固定的set实例,后续每次调用lambda生成内层字典时,都是直接复用这两个全局的set对象,因此所有内层字典的对应字段都指向同一内存地址,修改任意一个都会同步到所有内层字典中。
解决方案
- 方法一:直接在lambda中定义新的set实例
直接将内层字典的生成逻辑写在lambda内部,每次调用都会生成新的set:
from collections import defaultdict inn_d = lambda: {'Jobs': set(), 'Titles': set()} d = defaultdict(inn_d) d['A']['Jobs'].add('Cook') d['B']['Titles'].add('President') print(d)
输出和你预期的完全一致:
defaultdict(<function <lambda> at 0x...>, {'A': {'Jobs': {'Cook'}, 'Titles': set()}, 'B': {'Jobs': set(), 'Titles': {'President'}}})
- 方法二:用字典推导式适配多键场景
如果后续需要新增更多内层键,可以把键单独抽成列表,用字典推导式生成,维护更灵活:
from collections import defaultdict INNER_KEYS = ['Jobs', 'Titles'] # 每次调用都会遍历键列表生成全新的set实例 inn_d = lambda: {key: set() for key in INNER_KEYS} d = defaultdict(inn_d) d['A']['Jobs'].add('Cook') d['B']['Titles'].add('President') print(d)
效果和方法一完全一致。
内容的提问来源于stack exchange,提问作者nalgenebottle
相关产品推荐
相关产品推荐

