在使用python时,在参数里使用了[]
空列表作为默认值,然后pycharm就给出了这样的提示。
Default argument value is mutable
这是因为,在Python中,当函数参数使用可变类型(如列表、字典、集合等)作为默认值时,可能会遇到一个问题,即这些默认值在函数被多次调用时可能会被意外修改。这是因为Python在函数定义时计算一次默认值,并在之后的调用中重复使用这些默认值,而不是每次调用时都重新创建它们。
示例问题
考虑以下示例:
def add_to_list(item, my_list=[]):
my_list.append(item)
return my_list
# 第一次调用
print(add_to_list(1)) # 输出: [1]
# 第二次调用,期望输出 [2],但实际...
print(add_to_list(2)) # 输出: [1, 2]
# 第三次调用,期望输出 [3],但实际...
print(add_to_list(3)) # 输出: [1, 2, 3]
在这个例子中,my_list
参数的默认值是一个空列表,这个列表在函数第一次被定义时创建,并在之后的每次调用中都被重复使用。因此,当你向 my_list
添加元素时,这些改变会影响到之后所有的调用,因为列表是可变的。
解决方案
- 不要使用可变类型作为默认值:
最直接的解决方法是避免使用可变类型作为函数的默认值参数。相反,你可以使用None
作为默认值,并在函数体内根据需要创建一个新的可变类型实例。
def add_to_list(item, my_list=None):
if my_list is None:
my_list = []
my_list.append(item)
return my_list
print(add_to_list(1)) # 输出: [1]
print(add_to_list(2)) # 输出: [2]
print(add_to_list(3)) # 输出: [3]
- 文档说明:
如果你因为某些原因需要使用可变类型作为默认值,确保在文档中明确这一点,并警告用户注意其潜在的影响。 - 使用不可变类型:
如果可能,尽量使用不可变类型(如整数、浮点数、字符串、元组等)作为默认值。这些类型在函数被多次调用时不会受到意外修改的影响。
总之,当设计函数时,避免使用可变类型作为默认值参数。