首页 > 解决方案 > 为什么 deepcopy 不能在 python 字典上工作?

问题描述

如何在字典中实现deepcopy?

我的原始代码:

li1 = ['Column_6', 'Column_11']
delimiters = ['a','b','c','d']
inner_dict = dict.fromkeys(delimiters,[0,0])
delim_dict = dict.fromkeys(li1 ,None)
for k,v in delim_dict.items():
    delim_dict[k] = copy.deepcopy(inner_dict) 

print (delim_dict) 给出

{'Column_6': {'a': [0, 0], 'b': [0, 0], 'c': [0, 0], 'd': [0, 0]},
 'Column_11': {'a': [0, 0], 'b': [0, 0], 'c': [0, 0], 'd': [0, 0]}}
delim_dict['Column_6']['a'][0]=5
print (delim_dict)

{'Column_6': {'a': [5, 0], 'b': [5, 0], 'c': [5, 0], 'd': [5, 0]},
 'Column_11': {'a': [0, 0], 'b': [0, 0], 'c': [0, 0], 'd': [0, 0]}}

尽管进行了深度复制,为什么键 b、c、d 仍用 [5, 0] 更新?

我可以使用修改后的代码实现结果:

li1 = ['Column_6', 'Column_11']
delimiters = ['a','b','c','d']
#inner_dict = dict.fromkeys(delimiters,[0,0])
delim_dict = dict.fromkeys(li1 ,None)
for k,v in delim_dict.items():
    delim_dict[k] = {}
    for delim in delimiters:
        delim_dict[k][delim]=[0,0]

但是,我怎样才能通过深拷贝获得相同的结果,或者还有其他有效的方法吗?

注意:我尝试点击此链接: Python 中字典的深拷贝 没有运气。

标签: pythonpython-3.xdictionary

解决方案


您使用与所有inner_dict值相同的列表对象,并deepcopy尊重并保持这种方式。你显然不想要。所以一开始就不要这样做。inner_dict = {d: [0, 0] for d in delimiters}改为这样做。

正如文档所说fromkeys

所有的值都只引用一个实例,因此value通常是一个可变对象(例如空列表)是没有意义的。要获得不同的值,请改用 dict 理解。


推荐阅读