我有以下代码:
sportMappings = {"sport1" : {"file" : "sport1.json", "label" : "Sport 1"},"sport2" : {"file" : "sport2.json", "label" : "Sport 2"},"sport3" : {"file" : "sport3.json", "label" : "Sport 3"}}
normalizedEntries = {"o.json" : {"spotlight" : []}}
normalizedEntries = createList(normalizedEntries, map_key, sportMappings)
def createList(normalizedEntries, key, sportMappings):
for range in SOURCES["ranges"]:
data = read_files.readJSONUrl(logger, SOURCES[key] + str(range))
for entry in data["entries"]:
normalizedEntry = normalize(entry, "type")
if normalizedEntry is not None:
#append to a catchall dict
normalizedEntries["o.json"]["spotlight"].append(normalizedEntry)
if normalizedEntry["league"] in sportMappings:
if sportMappings[normalizedEntry["league"]]["file"] not in normalizedEntries:
normalizedEntries[sportMappings[normalizedEntry["league"]]["file"]] = {"spotlight" : []}
#append to the specific league to which that sport belongs...ie sport1, sport2
normalizedEntries[sportMappings[normalizedEntry["league"]]["file"]]["spotlight"].append(normalizedEntry)
else:
pass
return normalizedEntries
其中一点是获取json输入,迭代json中的每个对象,规范化其格式,然后将所有对象追加到o.json,然后将该条目附加到sportMappings dict的相应运动文件中。
我希望在迭代1之后,normalizedEntries的内容将是:
--o.json
--entryForSport2
--sport1.json
--sport2.json
--entryForSport2
--sport3.json
迭代后2 normalizedEntries的内容将是:
--o.json
--entryForSport2
--entryForSport1
--sport1.json
--entryForSport1
--sport2.json
--entryForSport2
--sport3.json
等等。
相反,在函数完全运行后,所有子字典都是相同的。
--o.json
--entryForSport2
--entryForSport1
--sport1.json
--entryForSport2
--entryForSport1
--sport2.json
--entryForSport2
--entryForSport1
--sport3.json
--entryForSport2
--entryForSport1
问题:为什么每次迭代都会将项目附加到所有子词典,而不是每个项目都会进入catch-all o.json然后再进入相应的运动子项? note - “ spotlight是一个列表,而不是一个字典,所以append()应该是合适的工具,是吗?
答案 0 :(得分:3)
您正在使用带有可变列表的常量字典对象。这意味着您现在正在整个结构中共享相同的字典对象(和列表对象)。
发布的代码不会这样做;用你在这里发布的内容替换你的常量。 : - )
如果必须使用常量(例如,在多个位置需要相同的结构),请使用工厂函数:
SPOTLIGHT = lambda: {'spotlight': []}
并在需要新副本的任何地方使用SPOTLIGHT()
。