You need to enable JavaScript to run this app. Python递归素数判断函数可变默认参数重复调用异常求解
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 09:06:04