我有一个嵌套的Python Dict,我试图从列表中获取值,然后将它们迭代到Dict的值中:
for row in rows:
Dict[A][AA][AAA] += 1
但是,当我打印我的dict时,它似乎是将所有增量添加到所有Dict条目中。我的意思是代替这个:
{KeyA:{KeyAA:{KeyAAA:5}}}
{KeyB:{KeyBB:{KeyBBB:10}}}
我得到了这个:
{KeyA:{KeyAA:{KeyAAA:15}}}
{KeyB:{KeyBB:{KeyBBB:15}}}
我有点难过。
编辑: 这就是Dicts的创建方式: 我首先浏览一个包含类型分类的长表。在我这样做的时候,我在主Dict中创建了一个新的条目。同时,我将所有独特的分类收集到一个subDict中,以便稍后我可以将它添加到主Dict中:
Dict = {}
subDict = {}
for row in skimRows:
Dict[row[0]] = {"Type":row[1],"Assoc":{}} # Save each ID and origin Type to Dict
if item not in subDict: # Check to see if unique item already exists in subDict
subDict[item] = 0
这显然是我出错的地方。我当时正在使用subDict并将其插入主Dict,没有意识到插入的subDict保留了它与原始subDict对象的关系:
for key in Dict: # After initial iteration and Type collection, add new subDict to each Dict key
Dict[key]["Assoc"] = subDict
解: 根据下面的正确答案,我通过添加.copy()
来修复它for key in Dict: # After initial iteration and Type collection, add new subDict to each Dict key
Dict[key]["Assoc"] = subDict.copy()
答案 0 :(得分:1)
您最里面的词典是共享的,而不是唯一的对象:
>>> somedict = {}
>>> somedict['foo'] = {'bar': 0}
>>> somedict['spam'] = somedict['foo']
>>> somedict['foo']['bar'] += 1
>>> somedict['spam']
{'bar': 1}
>>> somedict['foo'] is somedict['spam']
True
这两个键foo
和spam
都指向同一个对象,一个字典对象持有一个键bar
。
你不应该像这样重用你的词典。要么创建一个新的空的dictiorary:
somedict['spam'] = {'bar': 0}
或创建(浅)副本:
somedict['spam'] = somedict['foo'].copy()