在使用python时,在参数里使用了[]空列表作为默认值,然后pycharm就给出了这样的提示。

Default argument value is mutable 

关于Default argument value is mutable_Python

这是因为,在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]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

在这个例子中,my_list 参数的默认值是一个空列表,这个列表在函数第一次被定义时创建,并在之后的每次调用中都被重复使用。因此,当你向 my_list 添加元素时,这些改变会影响到之后所有的调用,因为列表是可变的。

解决方案

  1. 不要使用可变类型作为默认值
    最直接的解决方法是避免使用可变类型作为函数的默认值参数。相反,你可以使用 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]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  1. 文档说明
    如果你因为某些原因需要使用可变类型作为默认值,确保在文档中明确这一点,并警告用户注意其潜在的影响。
  2. 使用不可变类型
    如果可能,尽量使用不可变类型(如整数、浮点数、字符串、元组等)作为默认值。这些类型在函数被多次调用时不会受到意外修改的影响。

总之,当设计函数时,避免使用可变类型作为默认值参数。