You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python默认参数中start_index重置但unique_data集合不重置原因求解

可变与不可变默认参数的行为差异说明

核心原因是两种默认值的数据类型可变性不同:

  • start_index的默认值0是不可变的整数类型
  • unique_data的默认值set()是可变的集合类型

不可变默认参数的行为

不可变对象本身无法被修改,你在递归调用中对start_index做的加法操作,本质是创建了一个新的整数对象传入下一层递归,完全不会修改函数定义时生成的默认值0。因此每次在main_func中不传start_index调用函数时,都会直接使用最初定义的默认值0,看起来就是被“重置”了。

可变默认参数的行为

可变对象支持原地修改,你调用add方法往集合里加元素时,修改的就是函数定义阶段生成的那个默认集合对象本身,这个对象会一直保存在内存中不会重置。你每次在main_func中不传unique_data调用函数时,都会直接复用这个已经被之前的调用修改过的集合,因此会保留之前所有日期的数据。

这是Python最常见的开发坑之一,通用的规避方案是把可变默认参数的默认值设为None,在函数内部初始化可变对象:

def __get_data_for_date(date, start_index=0, unique_data=None):
    # 每次调用不传参数时,都会新生成一个空集合,避免不同调用互相干扰
    if unique_data is None:
        unique_data = set()
    data = api_call(date)

    data_set = unique_data

    for d in data:
        data_set.add(d['id'])

    if len(unique_data) < 100:
        return __get_data_for_date(date, start_index=start_index+len(data), unique_data=data_set)

    return data_set

内容的提问来源于stack exchange,提问作者connorvo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:39:03