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

lhrbest發表於2019-05-07



先來看列表中的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

+會複製成一個新物件,而且只能執行列表之間的操作,效能問題要考慮

 





About Me

........................................................................................................................

● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除

● 本文在itpub( http://blog.itpub.net/26736162 )、部落格園( http://www.cnblogs.com/lhrbest )和個人weixin公眾號( xiaomaimiaolhr )上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文部落格園地址: http://www.cnblogs.com/lhrbest

● 本文pdf版、個人簡介及小麥苗雲盤地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址:

........................................................................................................................

● QQ群號: 230161599 (滿) 、618766405

● weixin群:可加我weixin,我拉大家進群,非誠勿擾

● 聯絡我請加QQ好友 646634621 ,註明新增緣由

● 於 2019-05-01 06:00 ~ 2019-05-30 24:00 在魔都完成

● 最新修改時間:2019-05-01 06:00 ~ 2019-05-30 24:00

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

........................................................................................................................

小麥苗的微店

小麥苗出版的資料庫類叢書 http://blog.itpub.net/26736162/viewspace-2142121/

小麥苗OCP、OCM、高可用網路班 http://blog.itpub.net/26736162/viewspace-2148098/

小麥苗騰訊課堂主頁 https://lhr.ke.qq.com/

........................................................................................................................

使用 weixin客戶端 掃描下面的二維碼來關注小麥苗的weixin公眾號( xiaomaimiaolhr )及QQ群(DBA寶典)、新增小麥苗weixin, 學習最實用的資料庫技術。

........................................................................................................................

歡迎與我聯絡

 

 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2643533/,如需轉載,請註明出處,否則將追究法律責任。

相關文章