1. 程式人生 > >列表中的append,extend,+=,+的區別

列表中的append,extend,+=,+的區別

先來看列表中的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
  • +會拷貝成一個新物件,而且只能執行列表之間的操作,效能問題要考慮