Python字典遍历匹配值后仍返回None的问题求助
问题分析与修复方案
你的递归查找逻辑存在一个关键漏洞:当遍历字典遇到第一个非目标键的字典值时,你直接递归并返回它的结果。如果这个递归没找到目标,函数会直接返回None,完全跳过当前字典中后续的键。
举个例子,当你调用get_dict('test2.1', data)时:
- 程序先遍历
data的第一个键test1,发现不是目标键,于是递归进入test1对应的子字典查找 - 这个递归里找不到
test2.1,返回None - 你的函数直接把这个
None返回了,根本没机会去检查data里的test2键
而对于get_dict('test1.1', data),理论上递归能找到值,但如果你的代码在测试时依然返回None,大概率是因为递归逻辑的短路问题——只要某一层递归没返回有效值,整个调用链就会直接返回None。
修复后的代码
data = { 'test1': { 'test1.1': { 'a': 'a', 'b': 'b' } }, 'test2': { 'test2.1': { 'test2.2': { 'c': 'c', 'd': 'd' } }, 'test_list': [1,2,3] } } def get_dict(key, dict_data): for k, v in dict_data.items(): if k == key and isinstance(v, dict): print(v) return v else: if isinstance(v, dict): # 先保存递归结果,不直接返回 found = get_dict(key, v) # 只有递归找到目标时才返回,否则继续遍历当前字典的下一个键 if found is not None: return found # 遍历完所有键都没找到,返回None return None
关键修改点
- 不再直接返回递归调用的结果,而是先把结果存入变量
found - 只有当递归找到目标(
found不为None)时,才返回这个结果;如果没找到,继续循环当前字典的下一个键 - 遍历完所有键仍无匹配时,统一返回
None
扩展:支持返回任意类型的值
如果你需要返回目标键对应的任何类型(不只是字典),可以去掉isinstance(v, dict)的判断:
def get_dict(key, dict_data): for k, v in dict_data.items(): if k == key: print(v) return v else: if isinstance(v, dict): found = get_dict(key, v) if found is not None: return found return None
这样调用get_dict('test_list', data)会返回[1,2,3],更灵活。
内容的提问来源于stack exchange,提问作者nickanor
相关产品推荐
相关产品推荐

