python - 如何从递归字典检查中返回差异量
问题描述
我正在检查两个字典中键、值的差异。但是我可以打印差异,但我想将结果保存在一个变量中(是否存在差异,或者有多少差异)。
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 。
有人知道我如何使用此递归返回值吗?
解决方案
您必须更改findDiff(d1[k], d2[k], path, differences)
为differences += findDiff(d1[k], d2[k], path)
(正如我在评论中指出的那样)的原因是因为 Python 参数是通过 assignment 传递的,并且整数是不可变的。要更改整数,而不是将其传递给函数并在内部进行更改,您应该返回从内部更改它的程度(如链接示例所示)。
如果您还不太了解链接和整数不变性,简单来说,这意味着当您修改differences
in时findDiff(d1[k], d2[k], path, differences)
,differences
您已经拥有的“外部”不会被修改。解决方案是显式更改differences
using +=
,提供您想要的递归功能。
推荐阅读
- google-cloud-platform - 谷歌云站点在安装 2 小时后出现“504 网关错误”
- c++ - 在 C++ 中的用户回调期间遇到未处理的异常
- spring - 使用弹簧批处理作业加载数据时如何避免重复值?
- django - 如何为多项选择过滤器生成模式?
- reactjs - 如何将 api 调用中的值传递给 reducer 中的 initialState
- spring-boot - 空手道:如何使用 YAML 文件而不是 application.properties 配置空手道模拟 servlet?
- sql - 查询/结果中的 SQL Server + Eloquent 转换日期时间
- windows - 哪些文件夹构成了用户的个人资料
- amazon-web-services - 从 CloudFormation 模板生成代码(java、python 等)
- powershell-3.0 - 使用变量名输出多个文件的函数