Python用dict.fromkeys设空列表为值修改单键所有值同步变更原因
运行结果异常的原因
dict.fromkeys()的设计逻辑是:当传入的第二个参数为默认值时,只会生成一次该默认值对象,然后将所有键都绑定到这个对象的引用上,不会为每个键单独创建新的默认值实例。
你代码中传入的空列表[]是可变对象,因此字典d中所有键1、2、3、4指向的是内存中同一个列表对象。当你执行d[1].append(777)时,修改的是这个公共的列表对象,所以通过所有键访问这个列表时都会看到修改后的结果,最终输出所有键对应的值都是[777]。
实现预期效果的正确写法
要让每个键对应独立的空列表,推荐使用以下两种写法:
- 字典推导式写法(最直观,适合已知所有键的场景)
n = [1,2,3,4] d = {k: [] for k in n} d[1].append(777) print(d) # 输出:{1: [777], 2: [], 3: [], 4: []}
collections.defaultdict写法(适合后续需要动态新增键的场景)
from collections import defaultdict d = defaultdict(list) # 可以提前初始化所有键 n = [1,2,3,4] for k in n: d[k] # 访问不存在的键时会自动绑定独立的空列表 d[1].append(777) print(d) # 输出:defaultdict(<class 'list'>, {1: [777], 2: [], 3: [], 4: []}) # 如需转换为普通字典,调用dict(d)即可
注意:只有不可变对象(整数、字符串、元组等)适合作为
dict.fromkeys()的默认值,可变对象(列表、字典、集合等)使用该方法设置默认值都会出现所有键共享同一个对象的问题。
内容的提问来源于stack exchange,提问作者HREngineer
相关产品推荐
相关产品推荐

