我想使用循环创建字典词典(DofD)。在循环内部,我的'subdict'变量将被设置,然后为DofD添加一个新名称。
我从一个文件中读取内容,根据分隔符“####”将内容分成块,分隔我想要的每个子字典。我根据块中的一个字段命名DofD中的每个条目。
我很困惑,因为我的输出DofD已经正确命名了条目,但是各个子条目中的所有信息都是相同的。所有值都反映了最后一个子字典的内容。
idxs=[i for i,val in enumerate(fileContents) if val=='####\r\n']
paramsDict={}
for i in range(len(idxs)):
pos=idxs[i]
if i < len(idxs)-1: endLine=idxs[i+1]+1 # watch out for end of file
else: endLine=len(fileContents)
blockForSubDict=fileContents[idxs[i]+1:endLine]
paramsDict[blockForSubDict[0].split()[0]]={'Name': blockForSubDict[0].split()[0], 'Values' : [float(x.replace('\r\n','')) for x in blockForSubDict[5:lenBlock]]}
我手工编写了一个例子来创建一个字典词典,以确保我的语法没有做出奇怪的事情:
d1={'Name': 'name1', 'Value': 30}
d2={'Name': 'name2', 'Value': 29}
d3={}
d3[d1['Name']]=d1
d3[d2['Name']]=d2
d3
{'name1':{'姓名':'name1','价值':30}, 'name2':{'姓名':'name2','价值':29}}
这很有用。
我在循环中搞砸了什么?
答案 0 :(得分:1)
所以,问题是我的DofD中的条目实际上只是对我循环中的子句的引用。这意味着我的DofD只有一堆不同命名的条目,它们都指向同一个子条目。子句的内容随着每次迭代而改变,并最终反映了我循环中最后一次的块值。因此,我的DofD中的所有条目都显示了同一组子句值。
我没有在每次迭代中创建一个不同名称的子句,而是决定使用subict的deepcopy()进入DofD,以便每个条目都保持其独特的内容。
我的代码现在看起来像:
import copy
...
paramsDict[blockForSubDict[0].split()[0]]={'Name':
copy.deepcopy(blockForSubDict[0].split()[0]),
'Values' :
[copy.deepcopy(float(x.replace('\r\n',''))) for x in blockForSubDict[5:lenBlock]]}