在AWS Lambda Python 3中合并嵌套字典失败,调用update方法返回None求助
解决Python字典update返回None的问题
嘿,我来帮你搞定这个问题!你遇到的情况是Python字典的update()方法的特性导致的——这个方法是原地修改原字典,它的返回值就是None,所以你把a.update(b)赋值给变量c,得到的自然是None,而不是合并后的字典。
下面给你两种简单的解决方案,以及如果需要深度合并嵌套字典的处理方式:
方案1:先复制字典再更新
这种方法会保留原字典a和b的内容,生成一个新的合并后字典:
a = {'Action': 'DELETE', 'ResourceRecordSet': {'AliasTarget': {'HostedZoneId': 'BLABLABLA', 'EvaluateTargetHealth': False, 'DNSName': 'BLABLA'}, 'Type': 'A', 'Name': 'BLABLABLA'}} b = {'Action': 'UPSERT', 'ResourceRecordSet': {'TTL': 60, 'Type': 'CNAME', 'Name': 'BLABLA', 'ResourceRecords': [{'Value': 'blablabla'}]}} # 先复制a的所有内容到新字典c c = a.copy() # 用b的内容更新c(同名键会被b的内容覆盖) c.update(b) print(c)
执行后你就能得到合并后的字典,而不是None了。
方案2:用字典解包语法(Python 3.5+)
这是更简洁的写法,同样生成新字典,不修改原字典:
a = {'Action': 'DELETE', 'ResourceRecordSet': {'AliasTarget': {'HostedZoneId': 'BLABLABLA', 'EvaluateTargetHealth': False, 'DNSName': 'BLABLA'}, 'Type': 'A', 'Name': 'BLABLABLA'}} b = {'Action': 'UPSERT', 'ResourceRecordSet': {'TTL': 60, 'Type': 'CNAME', 'Name': 'BLABLA', 'ResourceRecords': [{'Value': 'blablabla'}]}} # 用解包语法合并两个字典,b的键会覆盖a的同名键 c = {**a, **b} print(c)
额外说明:深度合并嵌套字典
上面两种方法都是直接替换同名的嵌套字典(比如ResourceRecordSet会被b的完全替换),如果你的需求是合并嵌套字典里的键(而不是直接替换整个嵌套字典),那需要自己写一个递归的深度合并函数,比如:
def deep_merge(a, b): # 先复制a的内容 merged = a.copy() for key, value in b.items(): # 如果当前值是字典,且a里也有这个键且对应的值也是字典,就递归合并 if isinstance(value, dict) and key in merged and isinstance(merged[key], dict): merged[key] = deep_merge(merged[key], value) else: # 否则直接用b的值覆盖或添加 merged[key] = value return merged c = deep_merge(a, b) print(c)
这个函数会逐层合并嵌套的字典,只有当键冲突时才会用b的值覆盖a的。
内容的提问来源于stack exchange,提问作者Yanir
相关产品推荐
相关产品推荐

