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
相关产品推荐
相关产品推荐

