list=[3,7,'Mar','Feb','Jan'] # 列表中同時包含int 和string類型的元素list[3, 7, 'Mar', 'Feb', 'Jan']
tup=("hello",2022) #元組中同時包含int和string類型的元素tup('hello', 2022)列表和元組的區別
如下代碼所示,我們可以輕鬆的對列表進行修改,如把Jan變為Dec;
list=[3,7,"Mar",'Feb','Jan'] list[4]="Dec" #python 中的索引同樣從 0 開始,list[4]表示訪問列表的第5個元素Janlist[3, 7, 'Mar', 'Feb', 'Dec']如果元組也進行同樣的修改,python就會報TypeError,類型錯誤,因為元組是不可變的。tup=("hello",2022)tup[1]=2012--TypeError Traceback (most recent call last)<ipython-input-8-5669ecb45950> in <module> 1 tup=("hello",2022)----> 2 tup[1]=2012
TypeError: 'tuple' object does not support item assignment但是,你就是想對元組做出點"改變",那就只能對元組重新賦值,創建新的元組了;元組就好像你用鋼筆寫下的字,寫上就不能擦掉了,除非換一張紙重寫了,而列表就像是鉛筆寫下的字,寫錯了還可以擦掉更改。
如下圖代碼,我們增加一個元素2012給元組,實際上這相當於創建了一個新的元組了,把原來兩個元組的值依次填充進去。tup=("hello",2022)new_tup=tup + (2012,) # 創建新的元組 new_tup,依次填充原元組的值new_tup('hello', 2022, 2012)由於列表是可變的,我們只要在列表的末尾加上想要加的元素即可,如下圖代碼,只是修改原來列表的元素,而不再創建新的列表。list = [1,2,3,'Jan','Feb','Mar']list.append(4)list[1, 2, 3, 'Jan', 'Feb', 'Mar', 4]通過以上代碼,我們已經了解列表和元組的基本區別,下面我們再看看列表和元組的操作和注意事項。
負數索引從尾部開始,倒數第一個元素的索引為-1,-2表示倒數第二個元素,以此類推。list=[1, 2, 3, 'Jan', 'Feb', 'Mar', 4]list[-1]4
tup=('hello', 2022, 2012)tup[-1]2012list=[1, 2, 3, 'Jan', 'Feb', 'Mar', 4]list[1:3] #返回列表中索引從1到2的子列表[2,3]
tup=(1,2,3,4,5)tup[1:3]#返回元組中索引從1到2的子列表(2, 3)list = [[1, 2, 3],['Jan', 'Feb', 'Mar']]# 列表的每一個元素可以是一個列表tup=((1,2,3),(4,5)) # 元組的每一個元素也可以是一元組list=[1, 2, 3, 'Jan', 'Feb', 'Mar', 4] for i in list: print(i)123JanFebMar4tup=(1,2,3,4,5)for i in tup: print(i)12345list=[1, 2, 3, 2, 3, 1, 4] list.count(1) 2 list.index(4) 6 list.reverse() list[4, 1, 3, 2, 3, 2, 1]list.sort()list[1, 1, 2, 2, 3, 3, 4]list=[1,2,3,4,5,6]list.__sizeof__() #__sizeof__()列印系統分配空間的大小88
tup=(1,2,3,4,5,6)tup.__sizeof__()72由上圖可以看出,在列表和元組中放了相同的元素,但是元組的存儲空間要比列表的少16位元組,因為列表在存儲元素的時,還需要存儲指針來指向對應的元素。由於文章篇幅,列表空間分配的機制將在另一篇文章中介紹。
列表和元組的性能對比
通過了解列表和元組存儲方式的差異,我們可以得知:元組要比列表更輕量級些,元組性能速度要比列表略勝一籌。
我們再來看下初始化和索引訪問的時間對比。
python -m timeit "x=[1,2,3,4,5,6,7,8]"5000000 loops, best of 5: 55.1 nsec per looppython -m timeit "x=(1,2,3,4,5,6,7,8)"20000000 loops, best of 5: 11.5 nsec per loop以上初始化耗時對比可以看到,元組的初始化速度,要比列表快 4 倍多。
索引訪問
python -m timeit -s "x=[1,2,3,4,5,6,7,8]" "y=x[3]"10000000 loops, best of 5: 29.7 nsec per looppython -m timeit -s "x=(1,2,3,4,5,6,7,8)" "y=x[3]"10000000 loops, best of 5: 31.8 nsec per loop兩者訪問耗時的速度差別非常小,如果還想進行增加、刪減或者改變元素,那還是選擇列表吧,因為元組創建之後不可改變,因此元組比較適合存儲數據和數量不改變的場景,如一年的月份名稱,學生成績等;列表創建之後可以進行增刪改查,可以用來存儲商品名稱、網站日誌等場景。總結列表和元組都是有序的,可以存儲任意數據類型的集合,區別如下:列表是可變的,長度大小可變,可隨意增刪改查元素,存儲空間略大於元組,性能稍弱於元組,不能作為字典的鍵元組是不可變的,長度大小固定,不能進行增刪改操作,元組比列表訪問和處理速度快,能作為字典的鍵。