为什么 deepcopy 不适用于 python 字典?



如何在字典中实现深度拷贝?

我的原始代码:

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中字典的深度拷贝没有运气。

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

正如fromkeys文档所说:

所有的值都只引用一个实例,所以一般来说value是一个可变对象(如空列表)是没有意义的。若要获得不同的值,请使用字典推导式。

您可以尝试这样做:

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] = {key: value[:] for key, value in inner_dict.items()}
print (delim_dict)
delim_dict['Column_6']['a'][0]=5
print (delim_dict)

与[:]拼接和不使用复制模块

相关内容

  • 没有找到相关文章