我有一个嵌套字典来查找一些信息。由于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}
)