列表中的append,extend,+=,+的區別
阿新 • • 發佈:2019-01-01
先來看列表中的append和extend的幫助文件
>>> help(list.append) # 往列表末尾新增物件 Help on method_descriptor: append(...) L.append(object) -> None -- append object to end >>> help(list.extend) # 往通過新增迭代物件來擴充列表 Help on method_descriptor: extend(...) L.extend(iterable) -> None -- extend list by appending elements from the iterable >>>
再來看兩者的示例
# append往後新增單獨一個元素 >>> A = ["a", "b"] >>> A.append(1) >>> A ['a', 'b'] # append往後新增一整個列表 >>> A = ["a", "b"] >>> A.append(["c", "d"]) >>> A ['a', 'b', ['c', 'd']] # append往後新增一個迭代物件 >>> A = ["a", "b"] >>> A.append(range(10)) >>> A ['a', 'b', range(0, 10)] # append往後新增函式和類物件 >>> a = [1, 2] >>> class A: ... pass >>> def B(): ... pass >>> a.append(A) >>> a.append(B) >>> a [1, 2, <class '__main__.A'>, <function B at 0x000000000404B598>] # 往列表A,擴充一個列表物件 >>> A = ["a", "b"] >>> A.extend(["c", "d"]) >>> A ['a', 'b', 'c', 'd'] # 往列表A,擴充一個迭代物件range(4) >>> A = ["a", "b"] >>> A.extend(range(4)) >>> A ['a', 'b', 0, 1, 2, 3] # 往列表A,擴充一個迭代物件"ABCD" >>> A = [1, 2] >>> A.extend("ABCD") >>> A [1, 2, 'A', 'B', 'C', 'D']
再來看往extend後新增單獨元素會報錯,因為單獨元素是不可迭代的。
>>> A = ["a", "b"]
>>> A.extend(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
'int' object is not iterable
綜合上面的示例及報錯資訊,來總結extend, append方法:
- extend只能新增可迭代物件,而append即可新增可迭代物件,也可以新增單獨元素
- append後面新增的物件,不管是單獨元素,列表,可迭代物件,統統算一個元素往列表最後加入
- extend往後擴充的物件,是拿後面可迭代的所有元素往裡面新增
再來看+,+=的示例
# +=操作
>>> A = ["a", "b"]
>>> B = ["c", "d"]
>>> A += B
>>> A
['a', 'b', 'c', 'd']
# +操作
>>> A = ["a", "b"]
>>> B = ["c", "d"]
>>> A = A + B
>>> A
['a', 'b', 'c', 'd']
從上面的例子能看看出無論是+還是+=,都只能在列表之間操作
>>> A = ["a", "b"]
>>> B = 1
>>> A += B
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
'int' object is not iterable
>>> A = A + B
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list
can only concatenate list (not "int") to list
>>> A + range(10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "range") to list
can only concatenate list (not "range") to list
>>>
綜合上面的示例及報錯,來總結+,+=:
- 無論是+還是+=只能在兩個列表之間操作
- 都不能新增非列表物件
再來從id來看操作物件的變化
# 執行extend後,A的id不變
>>> A = [1, 2]
>>> B = [3, 4]
>>> id(A)
61099656
>>> A.extend(B)
>>> A
[1, 2, 3, 4]
>>> id(A)
61099656
# 執行append後,A的id不變
>>> A = [1, 2]
>>> B = [3, 4]
>>> id(A)
65986184
>>> A.append(B)
>>> A
[1, 2, [3, 4]]
>>> id(A)
65986184
# 執行+=後,A的id不變
>>> A = [1, 2]
>>> B = [3, 4]
>>> id(A)
63943112
>>> A += B
>>> A
[1, 2, 3, 4]
>>> id(A)
63943112
# 執行+後,A的id發生變化
>>> A = [1, 2]
>>> B = [3, 4]
>>> id(A)
61026568
>>> A = A + B
>>> A
[1, 2, 3, 4]
>>> id(A)
61026952
從上面的id來看,似乎又可總結出:
- 執行extend,append,+=這三個操作都是原地修改列表,都不會引起id的變化
- 執行+,會拷貝出一個新的物件,會引起id的變化
- 如果執行+操作,一旦操作物件很多的話,經常需要拷貝新物件,效能是四者中最差的
最後總結:
- extend原地修改列表,只可新增可迭代物件,待新增的物件有多少個就往原物件中新增多少個
- append原地修改列表,可新增任何物件,但無論是什麼物件,在末尾新增,而且只算一個元素
- +=原地修改列表,只可執行列表之間的操作,效果上相當於extend
- +會拷貝成一個新物件,而且只能執行列表之間的操作,效能問題要考慮