在 Python 中,+ 和 append() 都可以用于操作列表,但两者的行为、作用对象和性能差异显著。以下是具体区别和适用场景的总结:
1. 修改方式与返回类型
-
+运算符- 创建新列表:
+会将两个列表合并为一个 新列表,原列表不变。a = [1, 2] b = a + [3] # 新列表 [1, 2, 3],a 仍为 [1, 2] - 返回新对象:操作后需将结果赋值给变量,否则原列表不会被修改。
- 适用场景:需保留原列表时(如生成新数据集或避免副作用)。
- 创建新列表:
-
append()方法- 原地修改:直接在原列表末尾添加单个元素(整体添加,不拆解)。
a = [1, 2] a.append([3]) # 原列表变为 [1, 2, [3]] - 无返回值:返回
None,因此不能用于链式操作(如a.append(3).append(4)会报错)。 - 适用场景:需高效修改原列表(如动态收集数据)。
- 原地修改:直接在原列表末尾添加单个元素(整体添加,不拆解)。
2. 作用对象的差异
-
+处理可迭代对象- 要求两侧均为可迭代对象(如列表、元组),否则报错:
a = [1, 2] a + 3 # 报错,需改为 a + [3]
- 要求两侧均为可迭代对象(如列表、元组),否则报错:
-
append()添加任意对象- 可将任意类型(包括列表、字典等)作为 单个元素 添加到列表末尾:
a = [1, 2] a.append({"key": "value"}) # 列表变为 [1, 2, {'key': 'value'}]
- 可将任意类型(包括列表、字典等)作为 单个元素 添加到列表末尾:
3. 性能与效率
-
时间复杂度
+的时间复杂度为 O(n),因为需要复制原列表并创建新对象,频繁使用(如循环中)会导致性能问题。append()的时间复杂度为 O(1),仅修改列表末尾指针,适合高频操作。
-
内存占用
+每次操作都会占用新内存,而append()仅在列表扩容时触发内存重新分配(Python 内部优化机制)。
4. 函数默认参数中的陷阱
-
append()的副作用def func(a, lst=[]): lst.append(a) return lst func(1) # 返回 [1] func(2) # 返回 [1, 2](原列表被保留并修改)- 原因:默认参数
lst=[]在函数定义时创建,多次调用共享同一列表。
- 原因:默认参数
-
+的独立性def func(a, lst=[]): lst = [a] + lst return lst func(1) # 返回 [1] func(2) # 返回 [2](每次新建列表)- 原因:
lst = [a] + lst创建了新列表,原默认参数不受影响。
- 原因:
5. 特殊场景与替代方案
-
嵌套列表操作
append()可能导致嵌套结构(如[[1, 2], 3]),而extend()可展开可迭代对象(如[1, 2, 3])。- 示例:
a = [1, 2] a.extend([3, 4]) # 原列表变为 [1, 2, 3, 4]
-
列表推导式中的差异
temp = [[1, 2], [3, 4]] # append() 修改原列表,返回 None 列表 [e.append(5) for e in temp] # temp 变为 [[1, 2, 5], [3, 4, 5]] # + 生成新列表,原列表不变 new_list = [e + [5] for e in temp] # new_list 为 [[1, 2, 5, 5], [3, 4, 5, 5]]

总结建议
- 优先选择
append():当需要原地修改列表且不关心返回值时(如循环中添加元素)。 - 慎用
+:仅在需要保留原列表或合并多个列表时使用(注意性能问题)。 - 替代方案:
extend()用于批量添加元素,insert()用于指定位置插入。
通过合理选择操作符或方法,可显著提升代码效率和可读性。
2024

被折叠的 条评论
为什么被折叠?



