Python递归函数多次调用时如何清空结果列表?
解决Python递归函数中默认可变参数导致的列表复用问题
你的问题出在Python默认可变参数的初始化机制上:当你把result=[]作为函数默认参数时,这个列表对象是在函数定义时就创建的,所有后续调用都会复用同一个列表实例,所以第二次调用时会把新数据追加到旧列表里。
下面提供两种符合你要求(仅用递归+局部变量、非全局)的解决方案:
方案1:用None作为默认参数,内部初始化空列表
修改函数,将默认参数设为None,在函数开头判断并初始化空列表,这样每次调用函数时都会创建新的列表:
def add_chars(some_list, some_str, result=None): if result is None: result = [] if some_list == []: return result result.append(some_list[0]) if some_str != '': result.append(some_str[0]) return add_chars(some_list[1:], some_str[1:], result)
测试调用:
print(add_chars([2, 3, 18, "what", 9, "else", 8, 5], "absolute")) # 输出: [2, 'a', 3, 'b', 18, 's', 'what', 'o', 9, 'l', 'else', 'u', 8, 't', 5, 'e'] print(add_chars([1, 2, 3, 4, 5], "hel")) # 输出: [1, 'h', 2, 'e', 3, 'l', 4, 5]
方案2:使用辅助递归函数
通过外部函数初始化局部空列表,内部嵌套递归函数操作这个列表,确保每次调用外部函数时都新建列表:
def add_chars(some_list, some_str): result = [] def recursive_helper(lst, s): if lst == []: return result result.append(lst[0]) if s != '': result.append(s[0]) return recursive_helper(lst[1:], s[1:]) return recursive_helper(some_list, some_str)
两种方案都能解决你的问题,方案1更贴近你原来的代码结构,方案2则完全避免了默认可变参数的陷阱。
内容的提问来源于stack exchange,提问作者danial
相关产品推荐
相关产品推荐

