Python不要使用可变对象作为函数的默认参数

中一个常见的陷阱,与可变默认参数有关。

让我们看看AutoParamGroup类的__init__方法定义:

python 复制代码
def __init__(self, ref_mode=[], ref_value=[], ref_group_num=[], ref_interp_method=[], ref_gain_lux=0,
             param_list=[]):
    self.ref_mode = ref_mode
    self.ref_value = ref_value
    self.ref_group_num = ref_group_num
    self.ref_interp_method = ref_interp_method
    self.ref_gain_lux = ref_gain_lux
    self.param_list = param_list

这里的问题在于使用了可变对象(列表[])作为默认参数值。在Python中,默认参数值是在函数定义时就被创建的,而不是在函数调用时。这意味着所有使用默认参数的实例都会共享同一个列表对象。

要解决这个问题,推荐的做法是使用None作为默认值,然后在__init__方法中创建新的列表。以下是修正后的代码:

python 复制代码
def __init__(self, ref_mode=None, ref_value=None, ref_group_num=None, ref_interp_method=None, 
             ref_gain_lux=0, param_list=None):
    self.ref_mode = ref_mode if ref_mode is not None else []
    self.ref_value = ref_value if ref_value is not None else []
    self.ref_group_num = ref_group_num if ref_group_num is not None else []
    self.ref_interp_method = ref_interp_method if ref_interp_method is not None else []
    self.ref_gain_lux = ref_gain_lux
    self.param_list = param_list if param_list is not None else []

这样修改后:

  1. 每次创建新实例时都会创建新的列表对象
  2. 不同实例之间的列表将是独立的
  3. 不会出现数据残留的问题

这是Python中的一个经典问题,在使用可变对象(如列表、字典等)作为默认参数时经常会遇到。记住:永远不要使用可变对象作为函数的默认参数

相关推荐
whcyhhh4 分钟前
头歌实践教学平台:数据科学与大数据技术导论(十六)
大数据·开发语言·python
宸津-代码粉碎机6 分钟前
AI工程化高阶实战|从Demo到生产落地核心架构、全套源码与避坑指南
java·大数据·开发语言·人工智能·python·架构
郝学胜-神的一滴1 小时前
Effective Python 条款4:字符串格式化大乱斗
开发语言·网络·python·程序人生·软件工程
ynchyong2 小时前
Python 字符组合生成器:product 与 permutations 的实战对比
python·工具·字符串生产
benchmark_cc2 小时前
1000只ETF的5分钟K线如何批量获取?QuantDash分页策略与高性能Python实践
开发语言·人工智能·爬虫·python·算法·quantdash·量化数据源
sel_92 小时前
【PEFT】参数高效微调(PEFT)技术详解:从原理到 LoRA/QLoRA 实战
人工智能·python·深度学习·算法·机器学习·参数高效微调
月光船幽幽2 小时前
带刺反馈引擎:唤醒深层意图
人工智能·python
大模型码小白3 小时前
AI 提示词专栏:使用系统指令(System Prompt)实现全局约束
java·大数据·运维·开发语言·人工智能·python·prompt
烂蜻蜓3 小时前
Flask入门教程(八):视图函数详解——请求处理与响应的核心
后端·python·flask
河南凹凸环境艺术设计3 小时前
民宿酒店设计实力公司
大数据·人工智能·python