首页 > 解决方案 > 如何从递归字典检查中返回差异量

问题描述

我正在检查两个字典中键、值的差异。但是我可以打印差异,但我想将结果保存在一个变量中(是否存在差异,或者有多少差异)。

def findDiff(d1, d2, path="", differences = 0):
    for k in d1:
        if (k not in d2):
            print (path, ":")
            print (k + " as key not in d2", "\n")
            differences += 1
        else:
            if type(d1[k]) is dict:
                if path == "":
                    path = k
                else:
                    path = path + "->" + k
                findDiff(d1[k], d2[k], path, differences)
            else:
                if d1[k] != d2[k]:
                    print (path, ":")
                    print (" - ", k," : ", d1[k])
                    print (" + ", k," : ", d2[k])
                    differences += 1
    return differences

a = findDiff(moot_params, database_params)

print(a)

但是,如果最后一个字典不包含任何差异,这总是会导致 None 。

有人知道我如何使用此递归返回值吗?

标签: pythonpython-3.xdictionaryrecursion

解决方案


您必须更改findDiff(d1[k], d2[k], path, differences)differences += findDiff(d1[k], d2[k], path)(正如我在评论中指出的那样)的原因是因为 Python 参数是通过 assignment 传递的,并且整数是不可变的。要更改整数,而不是将其传递给函数并在内部进行更改,您应该返回从内部更改它的程度(如链接示例所示)。

如果您还不太了解链接和整数不变性,简单来说,这意味着当您修改differencesin时findDiff(d1[k], d2[k], path, differences)differences您已经拥有的“外部”不会被修改。解决方案是显式更改differencesusing +=,提供您想要的递归功能。


推荐阅读