默认参数的可变对象指的是在函数定义中使用可变对象(如列表、字典等)作为默认参数值。这可能会导致意外的行为。
- 因为默认参数只在函数定义时进行一次初始化,而不是每次函数调用时。
下面是一个简单的例子来描述这个问题:
def append_to_list(value, my_list=[]):
my_list.append(value)
return my_list
result1 = append_to_list(1)
print(result1) # 输出 [1]
result2 = append_to_list(2)
print(result2) # 输出 [1, 2]
在上面的例子中,我们定义了一个带有默认参数值的函数append_to_list
,并在函数体内修改了默认参数my_list
。当我们第一次调用append_to_list
时,它按预期返回了[1]
;但是当我们第二次调用append_to_list
时,它返回了[1, 2]
,而不是预期中的[2]
。
- 这是因为默认参数
my_list
在函数定义时只初始化一次,而后续的调用共享了同一个默认列表对象。
为了避免这个问题,可以使用不可变对象(如None)作为默认参数值,并在函数体内创建一个新的可变对象来处理这种情况,比如:
def append_to_list(value, my_list=None):
if my_list is None:
my_list = []
my_list.append(value)
return my_list
这样就能确保每次调用函数时都会得到一个新的空列表,避免了默认参数的可变对象带来的问题。