
Python 列表操作:append 方法与 + 运算符的细致比较
在 Python 函数中,使用默认参数时,可变对象(例如列表)的行为与不可变对象(例如数字)截然不同。本文深入探讨 append 方法和 + 运算符在定义函数时的差异,并解释其根本原因。
核心问题:为什么在 Python 函数中,使用 append 方法修改默认列表参数与使用 + 运算符修改默认列表参数的结果不同?
让我们分析以下代码:
立即学习“Python免费学习笔记(深入)”;
def zxc(a, b=[]):
b.append(a)
print(b)
zxc(1) # 输出: [1]
zxc(2) # 输出: [1, 2]
def asd(a, b=[]):
b = b + [a] # 等价于 b = [a] + b
print(b)
asd(1) # 输出: [1]
asd(2) # 输出: [2]
zxc 函数使用 append 方法向列表 b 添加元素。第一次调用 zxc(1),b 变成 [1];第二次调用 zxc(2),由于 b 指向同一个列表对象,append 方法直接修改了 b,因此输出 [1, 2]。
asd 函数使用 + 运算符创建一个新的列表,连接 a 和 b,并将结果赋值给 b。这意味着每次调用 asd 函数时,b 都被重新赋值为一个新的列表对象。第一次调用 asd(1),b 变成 [1];第二次调用 asd(2),b 被重新赋值为 [2],之前的 [1] 被丢弃,所以输出 [2]。
关键在于 b = b + [a] (或 b = [a] + b) 这行代码。= 号表示赋值操作,它创建了一个新的列表对象,并将此新对象赋值给变量 b。这与 append 方法直接修改原列表对象的特性完全不同:append 方法是就地修改,而 + 运算符则创建新的列表。因此,在 asd 函数中,每次调用都创建了一个新的列表,默认参数 b 的值不会被后续调用影响。只有当没有 b = 这样的赋值语句时,对 b 的修改才会影响后续的函数调用。 这凸显了理解 Python 中变量赋值和对象修改的重要性。 使用 + 运算符创建新的列表,避免了修改默认参数的潜在问题,通常被认为是更安全和可预测的做法。










