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

相关推荐
white-persist11 分钟前
MCP协议深度解析:AI时代的通用连接器
网络·人工智能·windows·爬虫·python·自动化
codists42 分钟前
2025年9月文章一览
python
语落心生44 分钟前
FastDeploy SD & Flux 扩散模型边缘端轻量化推理部署实现
python
java1234_小锋1 小时前
TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 立即执行模式(Eager Execution)
python·深度学习·tensorflow·tensorflow2
王大傻09281 小时前
numpy -- 算术函数 reciprocal() 和 power() 简介
python·numpy
咕白m6251 小时前
Python 将 Excel 转换为图片:实现数据可视化
后端·python
深蓝电商API2 小时前
不止是 Python:聊聊 Node.js/Puppeteer 在爬虫领域的应用
爬虫·python·node.js
Autumn72992 小时前
【材料学python入门】conda、 jupyter、cpu、GPAW、wsl、ubuntu
python·jupyter·conda
K2I-2 小时前
UCI中Steel Plates Faults不平衡数据集处理
python
蓑笠翁0012 小时前
Django REST Framework 全面指南:从模型到完整API接口开发
后端·python·django