Python递归遍历嵌套列表局部变量无法收集子列表元素原因求解
问题原因分析
局部变量版本结果不符合预期的原因
你的递归代码存在核心疏漏:每次调用refr函数时,都会在当前函数栈帧中创建一个全新的局部空列表loo,当你判断item是列表、递归调用refr(item)时,没有接收这次递归调用的返回值:
- 处理子列表
['no', 'ok']的那次递归调用,确实把两个字符串存到了它自己的局部loo里,也返回了['no', 'ok'],但你没有把这个返回的列表合并到外层调用的loo中,这部分内容就直接丢失了 - 最终返回的只有最外层调用的
loo里添加的非列表元素,所以结果是[1, 'dang', 0]
全局变量版本符合预期的原因
当你把loo改成全局变量后,所有层级的递归调用共享同一个列表对象:
- 不管是外层调用还是内层递归调用,执行
append操作都是往同一个全局loo里添加元素,所以子列表的内容也能正常被汇总 - 但这种写法存在严重缺陷:全局变量不会在函数调用时自动清空,如果你多次调用
refr函数,新的结果会拼接在上一次调用的结果后面,输出错误。
正确的无全局变量写法
只需要把递归调用的返回值合并到当前的loo中即可:
def refr(a_list): loo = [] for item in a_list: if isinstance(item, list): # 把递归返回的子列表元素合并到当前列表 loo.extend(refr(item)) else: loo.append(item) return loo print(refr([1, ['no', 'ok'], 'dang', 0])) # 输出:[1, 'no', 'ok', 'dang', 0]
内容的提问来源于stack exchange,提问作者Zy Taga
相关产品推荐
相关产品推荐

