具有相同内存地址的字典解耦

时间:2018-09-12 19:57:56

标签: python dictionary

我有以下代码:

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()轻松解决。对于字典,我找不到解决方案。为每个呼叫获得解耦结果需要做什么?

2 个答案:

答案 0 :(得分:1)

使用copy module并将new_results = results替换为new_results = copy.deepcopy(results)

文档也很好地解释了为什么会发生这种行为。

  

Python中的赋值语句不复制对象,它们创建   目标和对象之间的绑定。对于是   易变或包含易变项目,因此有时需要一份副本   可以更改一个副本而无需更改其他副本。该模块提供   通用的浅层和深层复制操作(如下所述)。

答案 1 :(得分:0)

为什么不在字典上使用copy()方法而不是分配(它只是将新名称绑定到当前字典)?

def collectResults(step):
    new_results = results.copy()