append()算法错误地附加

时间:2013-12-18 15:58:11

标签: python json algorithm list dictionary

我有以下代码:

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()应该是合适的工具,是吗?

1 个答案:

答案 0 :(得分:3)

您正在使用带有可变列表的常量字典对象。这意味着您现在正在整个结构中共享相同的字典对象(和列表对象)。

发布的代码不会这样做;用你在这里发布的内容替换你的常量。 : - )

如果必须使用常量(例如,在多个位置需要相同的结构),请使用工厂函数:

SPOTLIGHT = lambda: {'spotlight': []}

并在需要新副本的任何地方使用SPOTLIGHT()