即使保留副本,Python 嵌套字典也会被覆盖



我有一个嵌套字典来查找一些信息。由于python标记数据的方式,我使用dict的copy方法创建了字典的副本。但是当我更新最里面的字典时,它会更改所有其他日子(周一至周五(的其他字典。

以下是我如何启动我的主词典:self.faculty_to_day_hour_slot_map

self.faculty_to_day_hour_slot_map = {}
day_to_hour = {}
faculty_to_data = {} 
hour_to_allotflag = {}
for hour in range(1 , 9):
hour_to_allotflag.update({hour : {'alloted': False}.copy()}.copy()) ;
for day in ['mon' , 'tue' , 'wed' , 'thu' , 'fri' , 'sat']:
day_to_hour.update({day : hour_to_allotflag.copy()}.copy()) ;
for faculty_object in self.faculties:
self.faculty_to_day_hour_slot_map.update({faculty_object.id : day_to_hour.copy()}.copy()) ;

当我像这样更新最里面的字典时出现问题:

self.faculty_to_day_hour_slot_map.get(faculty).get(day).get(hour)['alloted'] = True

例如:

self.faculty_to_day_hour_slot_map.get('uniqueid').get('mon').get(1)['alloted'] = True 

这使得每天(周一至周五(内的所有"分配"为 True,小时 = 1

如何解决这个问题? 为什么尽管使用copy方法仍会发生这种情况?

原始字典看起来像这样:

{51: {'mon': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'tue': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'wed': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'thu': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'fri': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'sat': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}}},
15: {'mon': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'tue': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'wed': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'thu': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'fri': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'sat': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}}},
16: {'mon': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'tue': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'wed': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'thu': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'fri': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'sat': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}}},
17: {'mon': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'tue': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'wed': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'thu': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'fri': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'sat': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}}},
18: {'mon': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'tue': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'wed': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'thu': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'fri': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'sat': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}}},
19: {'mon': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'tue': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'wed': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'thu': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'fri': {1: {'alloted': True},
2: {'alloted': True},
3: {'alloted': True},
4: {'alloted': True},
5: {'alloted': True},
6: {'alloted': True},
7: {'alloted': True},
8: {'alloted': True}},
'sat': {1: {'alloted': True},
..... and so on 

copy(( 函数创建对象的浅拷贝。您在这里可能需要的是深层副本。

import copy
d1 = {"Strongest Avenger": "Thor"}
d2 = copy.deepcopy(d1)

https://docs.python.org/2/library/copy.html

正如评论和之前的答案所指出的,您应该使用deepcopy。此外,为了提高可读性,您可以使用functools.reduce来创建嵌套dict

from functools import reduce
from copy import deepcopy
faculty = list(range(10))
days = ['mon' , 'tue' , 'wed' , 'thu' , 'fri' , 'sat']
hours = list(range(1, 9))
res = reduce(
lambda d, ks: {k: deepcopy(d) for k in ks},
[hours, days, faculty],
{'alloted': True}
)

最新更新