Python可变对象以及何时复制它们

时间:2017-08-11 06:00:54

标签: python list dictionary recursion mutable

我有一个类似json的字典,其中包含其他字典和列表,如下所示:

        "A": {
            "attrib2": "bar", 
            "attrib1": "foo", 
            "B": "b", 
            "C": [
                "c1", 
                "c2"
            ], 
            "D": [
                {
                    "attrib3": "baz"
                }, 
                {
                    "attrib4": "muh"
                }
            ]
        }

每个值可以是(dictonaries或values)列表,字典或不可变值(如“c1”或5)。

现在我想通过获取它们所需的键来搜索我引用的特定值([“A”,“B”]将指向值“b”)。由于在给定的键路径中可能存在列表,因此我返回所有找到的值。我的功能如下:

def getValues(inputDict, keyList):
    """
        works on dicts in json-like format as outputted by complexXmlElement2dict
    """
    values = list()
    if keyList:
        key = keyList.pop(0)
        try:
            currentValue = inputDict[key]
        except KeyError:
            logger.debug("could not find key {}".format(key))
            return list()

        if isinstance(currentValue, dict):
            additionalValues = getValues(copy.deepcopy(currentValue), list(keyList))  # copy list and dict!!
            values.extend(additionalValues)

        elif isinstance(currentValue, list):
            for subDict in currentValue:
                assert isinstance(subDict, dict)
                values.extend(getValues(copy.deepcopy(subDict), list(keyList)))  # copy list and dict!!
        else:
            values.append(currentValue)

    return list(values)

正如你所看到的,我对这里使用的可变对象有些偏执。我正在复制剩下的键列表以找到正确的值以及我每次使用的字典。我的功能按预期工作,但我认为我通过不必要地复制所有这些对象来创建大量开销。

我什么时候可以省略复制这个例子中的词典和列表?为什么?试错是没有选择的,因为我没有所有可能的输入词典,也因为我想获得更好的理解。我应该补充一点,我已经阅读了许多python中可变对象的示例和解释,虽然我认为我理解这个概念我觉得不够舒服,但我不认为是不必要的,因为其他人依赖于这段代码的正确性。

getValues(copy.deepcopy(currentValue), list(keyList))
getValues(copy.deepcopy(subDict), list(keyList)))
return list(values)

我正在使用Python 2.7。

1 个答案:

答案 0 :(得分:0)

我找不到复制字典或列表的任何理由。您没有更新任何一个。您只是从中提取数据。所以只需在递归函数中传递引用即可。