Python递归素数判断函数可变默认参数重复调用异常求解
问题核心原因
这是Python中非常典型的可变默认参数陷阱,原理如下:
- Python的函数默认参数不会在每次函数调用时重新初始化,而是在函数被定义的阶段就完成一次性创建
- 你用列表(属于可变对象)作为
list_solution的默认值时,所有不传该参数的函数调用,操作的都是同一个初始创建的列表对象 - 你的代码中对
list_solution执行了append操作,修改会直接作用在这个全局共享的默认参数对象上,多次调用自然就会出现结果累加的现象。你手动传list_solution=[]的时候相当于每次都新建了独立的空列表传入,所以不会复用之前的旧数据。
修复方案
把可变默认参数的初始值改为None,在函数内部完成空列表的初始化即可,修改后的函数参考:
def is_prime(num, list_solution=None, recurse=False): # 函数内部初始化默认列表,每次调用都会生成新的空列表 if list_solution is None: list_solution = [] prime = True if type(num) == list: if len(num) > 1: recurse = True next_numbers = num[1:] num = num[0] else: num = num[0] if num <= 1: prime = False else: divisors = list(range(2, (num + 2) // 2)) for divisor in divisors: if num % divisor == 0: prime = False break if recurse == True: list_solution.append((num, prime)) list_solution = is_prime(num=next_numbers, list_solution=list_solution) return list_solution if list_solution != []: return list_solution else: return prime
修改之后即使不传list_solution参数,多次调用也不会出现结果累加的问题。
内容的提问来源于stack exchange,提问作者Braden Anderson
相关产品推荐
相关产品推荐

