我有以下代码:
results = {'location': [], 'analysis_Elem 1': [], 'analysis_Elem 2': [], 'analysis_Elem 3': []}
def collectResults(step):
new_results = results
for key in d: #here, d is another dictionary with a lot of results read from .csv file with the same keys as in the results dictionary
for line in d[key]:
if step in line[0]:
new_results[key].append(float(line[-1].strip())/1000)
for line in d[key]:
if step in line[0]:
new_results['location'].append(float(line[-4].strip()))
return new_results
res1 = collectResults('Time-step 7')
res2 = collectResults('Time -step 2')
在此函数中,当字典中的if语句满足时,我试图收集结果,该字典由具有相应空列表的键组成。这样的想法是,每次调用函数collectResults()时,我都希望获得分配给变量的结果。例如上面的res1,res2。我遇到的问题是,行new_results = results导致第二次调用该函数后,字典new_results(因此也有res2)包含了第一次调用后扩展到第二次调用的结果。我知道它们具有相同的内存地址这一事实,这就是覆盖的原因。对于列表,可以使用例如list()轻松解决。对于字典,我找不到解决方案。为每个呼叫获得解耦结果需要做什么?
答案 0 :(得分:1)
使用copy
module并将new_results = results
替换为new_results = copy.deepcopy(results)
。
文档也很好地解释了为什么会发生这种行为。
Python中的赋值语句不复制对象,它们创建 目标和对象之间的绑定。对于是 易变或包含易变项目,因此有时需要一份副本 可以更改一个副本而无需更改其他副本。该模块提供 通用的浅层和深层复制操作(如下所述)。
答案 1 :(得分:0)
为什么不在字典上使用copy()方法而不是分配(它只是将新名称绑定到当前字典)?
def collectResults(step):
new_results = results.copy()