插件窝 干货文章 Python函数默认参数:append与+运算符究竟有何区别?

Python函数默认参数:append与+运算符究竟有何区别?

列表 list 函数 默认 590    来源:    2025-03-15

在Python中,函数的默认参数是一个常见的特性,但在使用可变对象(如列表)作为默认参数时,需要特别注意。具体到append方法和+运算符,它们在处理列表时有一些关键的区别,尤其是在函数默认参数的上下文中。

1. append 方法

append 是一个列表方法,用于在列表的末尾添加一个元素。它会直接修改原列表。

def append_to_list(element, my_list=[]):
    my_list.append(element)
    return my_list

print(append_to_list(1))  # 输出: [1]
print(append_to_list(2))  # 输出: [1, 2]

在这个例子中,my_list 是一个默认参数,且是一个可变对象(列表)。由于默认参数在函数定义时只被计算一次,因此每次调用函数时,my_list 都会引用同一个列表对象。这会导致多次调用函数时,列表会累积之前添加的元素。

2. + 运算符

+ 运算符用于连接两个列表,并返回一个新的列表。它不会修改原列表。

def add_to_list(element, my_list=[]):
    return my_list + [element]

print(add_to_list(1))  # 输出: [1]
print(add_to_list(2))  # 输出: [2]

在这个例子中,my_list + [element] 创建了一个新的列表,而不会修改 my_list。因此,每次调用函数时,my_list 都会保持为默认的空列表 []

3. 关键区别

  • append 方法:会修改原列表,因此在函数默认参数的上下文中,会导致默认列表在多次调用中累积元素。
  • + 运算符:不会修改原列表,而是创建一个新的列表,因此在函数默认参数的上下文中,每次调用函数时都会使用一个新的空列表。

4. 最佳实践

为了避免在函数默认参数中使用可变对象时出现意外行为,通常建议使用 None 作为默认值,并在函数内部进行初始化。

def append_to_list(element, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(element)
    return my_list

print(append_to_list(1))  # 输出: [1]
print(append_to_list(2))  # 输出: [2]

这样,每次调用函数时,my_list 都会是一个新的空列表,避免了默认参数共享的问题。

总结

  • append 方法会修改原列表,导致默认参数在多次调用中共享。
  • + 运算符不会修改原列表,而是创建一个新的列表,因此不会共享默认参数。
  • 最佳实践是使用 None 作为默认值,并在函数内部进行初始化,以避免意外行为。