在Python中,append
方法和+
运算符在处理列表时表现出不同的行为,尤其是在函数默认参数中。这种差异的原因主要与Python中对象的可变性和默认参数的求值时机有关。
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
方法会直接修改这个列表对象,因此每次调用函数时,列表的内容都会发生变化。
+
运算符+
运算符用于连接两个列表,并返回一个新的列表。它不会修改原列表,而是创建一个新的列表对象。
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
都是一个全新的空列表。