如何在字典中实现深度拷贝?
我的原始代码:
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)
与[:]拼接和不使用复制模块