extend() 是 Python 列表用於批次新增多個元素的核心方法,將可迭代物件(列表、元組、字串、range、生成器等)展開後逐一加入列表末尾。與 append() 的「整體加入」形成鮮明對比,是列表合併、展平、累積資料的標準工具。
list.extend(iterable)
list(dict))回傳 None,原地修改列表(in-place),不建立新列表。
#!/usr/bin/python
aList = [123, 'xyz', 'zara', 'abc', 123]
bList = [2009, 'manni']
aList.extend(bList)
print("Extended List :", aList)
# 輸出:Extended List : [123, 'xyz', 'zara', 'abc', 123, 2009, 'manni']
| 特性 | append(x) | extend(iterable) |
|---|---|---|
| 參數型別 | 單一物件 | 可迭代物件 |
| 加入方式 | 整體作為一個元素 | 展開後逐一加入 |
| 列表長度變化 | +1 | +len(iterable) |
| 巢狀結構 | 會產生 | 不會(展平一層) |
lst = [1, 2]
lst.append([3, 4])
print(lst) # [1, 2, [3, 4]] ← 巢狀
lst = [1, 2]
lst.extend([3, 4])
print(lst) # [1, 2, 3, 4] ← 展平
# 列表
[1,2].extend([3,4]) # [1,2,3,4]
# 元組
[1,2].extend((3,4)) # [1,2,3,4]
# 字串(展開為字元!)
[1,2].extend('ab') # [1, 2, 'a', 'b']
# range
[1,2].extend(range(3,5)) # [1, 2, 3, 4]
# 集合(順序不定)
[1,2].extend({3,4}) # [1, 2, 3, 4] 或 [1, 2, 4, 3]
# 字典(展開 keys)
[1,2].extend({3:'a', 4:'b'}) # [1, 2, 3, 4]
# 生成器
[1,2].extend(x*2 for x in range(3)) # [1, 2, 0, 2, 4]
# 方法一:extend(原地修改,記憶體效率佳)
result = []
for lst in [list1, list2, list3]:
result.extend(lst)
# 方法二:itertools.chain(大量列表、串流處理)
from itertools import chain
result = list(chain(list1, list2, list3))
# 方法三:+ 運算子(產生新列表,小列表適用)
result = list1 + list2 + list3
nested = [[1,2], [3,4], [5,6]]
flat = []
for sublist in nested:
flat.extend(sublist)
print(flat) # [1, 2, 3, 4, 5, 6]
# 列表生成式替代
flat = [x for sublist in nested for x in sublist]
# 不好的做法:每次迴圈產生新列表
result = []
for chunk in data_chunks:
result = result + process(chunk) # O(n²) 記憶體複製
# 好的做法:extend 原地累積
result = []
for chunk in data_chunks:
result.extend(process(chunk)) # O(n) 總時間
# 錯誤:append 會把整個列表當一個元素
words = []
words.append("hello world".split())
print(words) # [['hello', 'world']]
# 正確:extend 展開
words = []
words.extend("hello world".split())
print(words) # ['hello', 'world']
extend() 顯著優於 + 或 +=(後者會建立新列表)
# 陷阱 1:字串會被展開為字元
lst = []
lst.extend("abc")
print(lst) # ['a', 'b', 'c'] 而非 ['abc']
# 正確加入完整字串
lst.append("abc") # ['abc']
# 或
lst.extend(["abc"]) # ['abc']
# 陷阱 2:extend 字典只展開 keys
d = {'a': 1, 'b': 2}
lst = []
lst.extend(d)
print(lst) # ['a', 'b'] 非 [('a',1), ('b',2)]
# 若要展開 key-value pairs
lst.extend(d.items()) # [('a', 1), ('b', 2)]
extend() 是列表批次新增元素的標準方法,展開可迭代物件、原地修改、回傳 None。核心優勢在於記憶體效率(避免建立中間列表)與語意清晰(展平一層)。掌握 append()(單一整體)與 extend()(批次展開)的差異,並善用於列表合併、展平、資料累積等場景,能寫出更高效、更 Pythonic 的程式碼。