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

相关推荐
王国强200942 分钟前
Python 异步编程的原理与实践
python
不枯石2 小时前
Python实现RANSAC进行点云直线、平面、曲面、圆、球体和圆柱拟合
python·计算机视觉
站大爷IP2 小时前
Python Lambda:从入门到实战的轻量级函数指南
python
深盾安全2 小时前
Python 装饰器精要
python
站大爷IP2 小时前
Python爬虫基本原理与HTTP协议详解:从入门到实践
python
山烛2 小时前
深度学习:卷积神经网络(CNN)
图像处理·人工智能·python·深度学习·cnn·卷积神经网络
明天过后01223 小时前
PDF文件中的相邻页面合并成一页,例如将第1页和第2页合并,第3页和第4页合并
java·python·pdf
空白到白3 小时前
算法练习-合并两个有序数组
数据结构·python·算法
跟橙姐学代码4 小时前
Python 函数实战手册:学会这招,代码能省一半!
前端·python·ipython
小沈不会泛函4 小时前
2024年华为杯C题优秀论文赏析第五问优化问题(多目标转化单目标、粒子群算法等)
python·数据分析·智能优化算法