Python列表(List)终极指南:extend() 方法 vs append(),一篇讲透!
** 还在为 append() 和 extend() 的区别而烦恼?本文将通过丰富的代码示例和场景分析,彻底让你掌握Python列表的 extend() 方法,提升你的代码效率和可读性。

(Meta Description)
想深入了解Python的 list.extend() 方法吗?本文详细讲解了 extend() 的用法、与 append() 的核心区别、性能对比以及实际应用场景,无论你是Python新手还是希望巩固基础的开发者,这篇指南都将帮助你写出更地道、更高效的Python代码。
引言:为什么你需要关心 extend()?
在Python编程中,列表(List)是我们最常用的数据结构之一,它就像一个可以随时增删改查的“魔法口袋”,当我们需要向这个口袋里添加新元素时,第一个想到的可能是 append() 方法,当你需要一次性添加多个元素时,append() 可能会“力不从心”,甚至引入不易察觉的逻辑错误。
这时,list.extend() 方法就闪亮登场了,它专门为“批量追加”而设计,是Python程序员工具箱中一个不可或缺的利器,本文将带你全面、深入地理解 extend(),让你在处理列表时游刃有余。
extend() 方法速览:核心功能与语法
extend() 方法用于将一个可迭代对象(如列表、元组、集合、字符串等)的所有元素,逐个追加到当前列表的末尾。

基本语法:
list.extend(iterable)
list: 你想要扩展的目标列表。iterable: 任何可迭代对象,它的每个元素都会被“取出来”,然后添加到list中。
简单示例:
想象一下,你的购物清单(shopping_list)已经有一些东西了,现在你又买了一整箱水果,需要把它们都加到清单里。
# 初始购物清单 shopping_list = ['苹果', '牛奶', '面包'] # 新买的“一整箱”水果,它本身是一个列表 new_fruits = ['香蕉', '橙子', '草莓'] # 使用 extend() 将新水果添加到清单 shopping_list.extend(new_fruits) # 打印结果 print(shopping_list)
输出结果:

['苹果', '牛奶', '面包', '香蕉', '橙子', '草莓']
看到区别了吗?new_fruits 这个列表本身并没有被添加进去,而是它里面的每一个元素都被追加到了 shopping_list 的末尾。
extend() vs append():99% 的初学者都会混淆
这是理解 extend() 最关键的一步。append() 和 extend() 都能向列表添加元素,但它们的哲学完全不同。
append():把整个东西“塞”进去
append() 方法会将传入的参数作为一个整体元素,追加到列表的末尾。
示例:
# 初始清单 my_list = ['苹果', '牛奶'] # append() 一个新列表 my_list.append(['香蕉', '橙子']) # 打印结果 print(my_list)
输出结果:
['苹果', '牛奶', ['香蕉', '橙子']]
注意看!结果列表的长度是3,第三个元素是一个子列表 ['香蕉', '橙子'],这通常不是我们想要的结果,除非你确实需要创建一个嵌套列表。
extend():把东西里的“零件”一个个“装”进去
extend() 则会“拆解”可迭代对象,将其中的每个元素作为独立的项添加到列表。
示例:
# 初始清单 my_list = ['苹果', '牛奶'] # extend() 一个新列表 my_list.extend(['香蕉', '橙子']) # 打印结果 print(my_list)
输出结果:
['苹果', '牛奶', '香蕉', '橙子']
这次,结果列表的长度是4,所有水果都平铺在了一层。
一张图看懂区别
| 操作 | 列表 my_list |
操作 | 结果列表 my_list |
长度变化 |
|---|---|---|---|---|
my_list = ['A', 'B'] |
['A', 'B'] |
len=2 |
||
my_list.append(['C', 'D']) |
追加 ['C', 'D'] |
['A', 'B', ['C', 'D']] |
len=3 |
|
my_list.extend(['E', 'F']) |
追加 E, F |
['A', 'B', 'E', 'F'] |
len=4 |
核心记忆点:
append()追加一个元素(即使这个元素是个列表)。extend()追加多个元素(来自可迭代对象)。
extend() 的进阶用法:不仅仅是列表
extend() 的强大之处在于,它的参数可以是任何可迭代对象,而不仅仅是列表。
使用元组 (tuple) 扩展
numbers = [1, 2, 3] new_numbers_tuple = (4, 5) numbers.extend(new_numbers_tuple) print(numbers) # 输出: [1, 2, 3, 4, 5]
使用集合 扩展
集合是无序的,但 extend() 会按其迭代顺序添加。
data = ['a', 'b']
new_set = {'c', 'd', 'a'} # 注意 'a' 已存在
data.extend(new_set)
print(data) # 输出可能是: ['a', 'b', 'c', 'd'] (顺序可能因版本而异)
使用字符串 扩展 ⚠️ (特别注意!)
字符串在Python中也是一个可迭代对象,它的迭代单位是单个字符。
message = "Hello"
message.extend(" World!")
# print(message) # 这会报错!因为字符串是不可变的,不能被修改。
# 正确的用法是先定义一个列表
char_list = ['H', 'e', 'l', 'l', 'o']
char_list.extend(" World!")
print(char_list) # 输出: ['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!']
这个特性非常有用,比如你想将一个单词拆分成字母列表,但如果你是想把整个字符串作为一个元素添加,你应该用 append()。
性能对比:为什么 extend() 更快?
在需要合并两个列表时,使用 extend() 通常比使用 或 操作符更高效。
list1 = list1 + list2
这种方法会创建一个全新的列表对象,然后将 list1 和 list2 的内容复制到这个新列表中,让变量 list1 指向这个新列表,原始的 list1 对象会被垃圾回收,对于大列表,这个过程会消耗较多内存和时间。
list1 += list2 或 list1.extend(list2)
这两种方式( 在列表上底层调用的是 extend())是原地操作,它们不会创建新列表,而是直接在 list1 的内存空间上进行修改,将 list2 的元素追加到末尾,这避免了额外的内存分配和复制,因此性能更高,尤其是在处理大型列表时。
代码示例:
import timeit
# 测试数据
list_a = list(range(100000))
list_b = list(range(100000))
# 测试 + 操作符
def test_plus():
list_c = list_a + list_b
return list_c
# 测试 extend 操作
def test_extend():
list_d = list_a.copy() # 为了公平,复制一份
list_d.extend(list_b)
return list_d
# 运行时间测试
time_plus = timeit.timeit(test_plus, number=100)
time_extend = timeit.timeit(test_extend, number=100)
print(f"'+' 操作符平均耗时: {time_plus:.4f} 秒")
print(f"'extend()' 方法平均耗时: {time_extend:.4f} 秒")
在你的机器上运行,几乎可以肯定会发现 extend() 的速度远快于 。合并列表时,优先使用 extend() 或 。
实战场景:extend() 的用武之地
场景1:从文件中逐行读取并合并
假设你有一个大文件,需要将它的所有行读入到一个列表中,使用 extend() 可以高效地处理。
all_lines = []
with open('my_large_file.txt', 'r', encoding='utf-8') as f:
# 假设文件行数很多,分批处理
for i, line in enumerate(f):
if i % 1000 == 0:
# 每读取1000行,就合并一次,减少内存峰值
batch = [line.strip() for _ in range(1000)] # 模拟
all_lines.extend(batch)
else:
all_lines.append(line.strip())
# print(all_lines[:10]) # 打印前10行
场景2:动态构建数据列表
在循环中,根据条件收集来自不同来源的数据。
# 模拟从不同API获取用户ID
user_ids_from_api_1 = [101, 102, 103]
user_ids_from_api_2 = [201, 202, 203, 204]
all_user_ids = []
all_user_ids.extend(user_ids_from_api_1)
all_user_ids.extend(user_ids_from_api_2)
print(f"所有用户ID: {all_user_ids}")
# 输出: 所有用户ID: [101, 102, 103, 201, 202, 203, 204]
常见误区与最佳实践
误区1:extend() 会修改原列表吗?
是的,extend() 是一个原地操作,它会直接修改调用它的列表,并返回 None,这是一个非常重要的点!
反面教材:
original_list = [1, 2, 3]
new_list = original_list.extend([4, 5])
# 错误地以为 new_list 是扩展后的列表
print(f"original_list: {original_list}") # 正确: [1, 2, 3, 4, 5]
print(f"new_list: {new_list}") # 错误! new_list 是 None
最佳实践: 永远不要将 extend() 的结果赋值给一个新变量,直接使用 my_list.extend(...)。
误区2:extend() 可以添加单个元素吗?
可以,但这样做非常不“Pythonic”(不地道),如果你想添加单个元素,请使用 append()。
# 不推荐 my_list = [] my_list.extend([10]) # 为了添加一个10,却创建了一个临时列表 [10] # 推荐 my_list.append(10)
extend() 在你的Python工具箱中的位置
| 方法 | 功能 | 参数 | 是否原地操作 | 返回值 | 适用场景 |
|---|---|---|---|---|---|
append() |
在末尾添加一个元素 | 任意对象 | 是 | None |
添加单个元素,或作为整体添加一个子列表。 |
extend() |
在末尾添加多个元素 | 可迭代对象 | 是 | None |
批量添加元素,合并列表,性能高。 |
| / | 连接列表 | 列表 | 不是, 是 | 返回新列表, 返回 None |
用于创建新列表;(等同于extend)用于原地合并。 |
你应该已经完全掌握了Python的 list.extend() 方法,记住它的核心——“拆解可迭代对象,批量追加”,并时刻与 append() 区分开来,在下次需要向列表中添加多个元素时,毫不犹豫地选择 extend(),让你的代码既高效又优雅!
思考与练习
为了巩固你的学习,尝试回答以下问题并动手实践:
- 如何使用
extend()将一个字符串'Python'的每个字母添加到一个空列表中? - 给定两个列表
a = [1, 2, 3]和b = ['a', 'b'],编写代码,使用extend()使a变为[1, 2, 3, 'a', 'b']。 - 如果你想实现
a = a + b的效果,但又不希望创建新列表(为了性能),应该用什么方法?
欢迎在评论区分享你的答案和疑问!
