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

Python函数默认参数:append与+运算符修改列表有何区别?

list 列表 append 函数 653    来源:    2025-03-15

在Python中,函数默认参数的行为在使用append方法和+运算符修改列表时会有显著的区别。具体来说,这两种操作会影响默认参数的可变性和共享性。

1. 使用append方法修改列表

当你使用append方法修改列表时,你是在原地修改列表对象。这意味着如果你在函数定义中将一个列表作为默认参数,并且在函数内部使用append方法修改这个列表,那么这个修改会影响到所有对该函数的调用。

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

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

在这个例子中,my_list作为默认参数,每次调用append_to_list函数时,my_list都会保留之前的值,因为默认参数在函数定义时就已经创建,并且在后续调用中共享同一个列表对象。

2. 使用+运算符修改列表

当你使用+运算符修改列表时,你实际上是创建了一个新的列表对象。这意味着每次调用函数时,+运算符都会生成一个新的列表,而不会影响到默认参数。

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

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

在这个例子中,my_list作为默认参数,每次调用add_to_list函数时,my_list都会被重新赋值为一个新的列表,因此不会保留之前的值。

3. 总结

  • append方法:会原地修改列表,导致默认参数在多次调用中共享同一个列表对象。
  • +运算符:会创建一个新的列表对象,不会影响默认参数。

为了避免默认参数在多次调用中共享同一个列表对象,通常建议将默认参数设置为None,并在函数内部初始化一个新的列表:

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

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

这样可以确保每次调用函数时,my_list都是一个全新的列表对象。