合并同键多个子dictionary时key 'b'出现多余元素,求问题原因
问题分析与解决
问题根源
你遇到的key 'b'出现多余元素的问题,核心原因是可变列表的引用传递:
- 初始化
d1和d2时,字典中的值直接指向fruits和cars原列表的引用,而非独立的新列表。 - 第一次循环后,
d['b']与原cars列表共享同一内存地址。 - 处理
d2的key 'a'时,fruits.extend(cars)直接修改了原fruits列表(此时d2['b']仍指向这个被修改的fruits)。 - 后续处理
key 'b'时,cars.extend(d2['b'])等价于把已经包含cars元素的fruits追加到cars里,导致d['b']多出了重复的Ford, BMW, Volvo。
解决方法
只需切断字典值与原列表的引用关联,创建列表副本即可,以下两种方式都能解决:
方式一:初始化字典时创建列表副本
fruits = ['apple', 'banana', 'cherry'] cars = ['Ford', 'BMW', 'Volvo'] d = {} # 用list()或切片[:]生成原列表的副本 d1 = {'a': list(fruits), 'b': list(cars)} d2 = {'a': list(cars), 'b': list(fruits)} l = [d1, d2] for i in l: if not d: d.update(i) else: for k in d.keys(): d[k].extend(i[k]) print(f"{d=}")
方式二:初始化合并字典时创建副本
fruits = ['apple', 'banana', 'cherry'] cars = ['Ford', 'BMW', 'Volvo'] d = {} d1 = {'a': fruits, 'b': cars} d2 = {'a': cars, 'b': fruits} l = [d1, d2] for i in l: if not d: # 对第一个字典的所有值创建副本,避免引用原列表 d = {k: list(v) for k, v in i.items()} else: for k in d.keys(): d[k].extend(i[k]) print(f"{d=}")
运行任意一种代码,都会得到预期输出:
d={'a': ['apple', 'banana', 'cherry', 'Ford', 'BMW', 'Volvo'], 'b': ['Ford', 'BMW', 'Volvo', 'apple', 'banana', 'cherry']}
内容的提问来源于stack exchange,提问作者winter
相关产品推荐
相关产品推荐

