插件窝 干货文章 Python列表操作:append与+运算符在函数默认参数中行为差异的原因是什么?

Python列表操作:append与+运算符在函数默认参数中行为差异的原因是什么?

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

在Python中,append方法和+运算符在处理列表时表现出不同的行为,尤其是在函数默认参数中。这种差异的原因主要与Python中对象的可变性和默认参数的求值时机有关。

1. append 方法

append 方法是直接修改原列表,即在原列表的末尾添加一个元素。由于列表是可变对象,append 方法会直接修改列表的内容。

def func_with_append(my_list=[]):
    my_list.append(1)
    return my_list

print(func_with_append())  # 输出: [1]
print(func_with_append())  # 输出: [1, 1]

在这个例子中,my_list 是一个默认参数,它的默认值是一个空列表 []。由于默认参数在函数定义时就已经被求值并存储在函数的 __defaults__ 属性中,因此每次调用 func_with_append 时,my_list 都会引用同一个列表对象。append 方法会直接修改这个列表对象,因此每次调用函数时,列表的内容都会发生变化。

2. + 运算符

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

def func_with_plus(my_list=[]):
    my_list = my_list + [1]
    return my_list

print(func_with_plus())  # 输出: [1]
print(func_with_plus())  # 输出: [1]

在这个例子中,my_list = my_list + [1] 创建了一个新的列表对象,并将其赋值给 my_list。由于 my_list 是一个局部变量,每次调用函数时,my_list 都会引用一个新的列表对象,而不会修改默认参数中的列表。因此,每次调用 func_with_plus 时,返回的都是一个新的列表 [1]

总结

  • append 方法:直接修改原列表,因此在函数默认参数中,多次调用函数会导致默认参数列表的内容发生变化。
  • + 运算符:创建一个新的列表对象,因此在函数默认参数中,多次调用函数不会影响默认参数列表的内容。

为了避免这种问题,通常建议在函数中使用 None 作为默认参数,并在函数内部初始化列表:

def func_with_append(my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(1)
    return my_list

print(func_with_append())  # 输出: [1]
print(func_with_append())  # 输出: [1]

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