Python dict.fromkeys追加值为何所有键对应列表同步修改
问题根因
dict.fromkeys()方法接收的第二个参数是一个提前创建好的对象,方法执行时会把所有字典键的值都指向同一个对象引用,不会为每个键单独生成新的对象。
你代码里传给fromkeys的空列表[]在方法调用时仅被创建了1次,key1和key2对应的value本质都是这同一个列表的引用,内存地址完全一致。不管你通过哪个键操作这个列表,修改的都是同一份数据,所以执行append后两个键对应的列表都会出现新增的"test"。
你可以用下面的代码验证引用相同的逻辑:
list_f = ["key1", "key2"] dic_f = dict.fromkeys(list_f, []) # 打印两个值的内存ID print(id(dic_f["key1"])) print(id(dic_f["key2"]))
执行后会发现两个ID完全相同,证明二者指向同一个列表对象。
正确写法
要实现每个键绑定独立空列表的效果,不要直接给fromkeys传入列表这类可变对象作为默认值,用字典推导式即可——推导式遍历每个键时,都会单独为当前键创建一个全新的空列表,各个键对应的值互不影响:
list_f = ["key1", "key2"] # 为每个键生成独立的空列表 dic_f = {key: [] for key in list_f} dic_f["key1"].append("test") print(dic_f)
执行后得到的输出完全符合预期:
{'key1': ['test'], 'key2': []}
注意:所有可变类型(列表、字典、自定义实例等)作为
dict.fromkeys()的第二个参数时都会出现这个引用共用的问题;不可变类型(数字、字符串、不可变元组)本身不支持原地修改,不会出现这类连带修改的异常,可以直接作为默认值传入。
内容的提问来源于stack exchange,提问作者zimon
相关产品推荐
相关产品推荐

