python學習10.08:Python元組和列表的區別

元組和列表同屬序列類型,且均可以按照特定順序存放一組數據,數據類型不受限制,只要是 Python 支持的數據類型就能夠。那麼,元組和列表有哪些區別呢?python

元組和列表最大的區別就是,列表中的元素能夠進行任意修改,就比如是用鉛筆在紙上寫的字,寫錯了還能夠擦除重寫;而元組中的元素沒法修改,除非將元組總體替換掉,就比如是用圓珠筆寫的字,寫了就擦不掉了,除非換一張紙。緩存

能夠理解爲,tuple 元組是一個只讀版本的 list 列表。

須要注意的是,這樣的差別勢必會影響二者的存儲方式,咱們來直接看下面的例子:函數

>>> listdemo = []
>>> listdemo.__sizeof__()
40
>>> tupleDemo = ()
>>> tupleDemo.__sizeof__()
24

能夠看到,對於列表和元組來講,雖然它們都是空的,但元組卻比列表少佔用 16 個字節,這是爲何呢?oop

事實上,就是因爲列表是動態的,它須要存儲指針來指向對應的元素(佔用 8 個字節)。另外,因爲列表中元素可變,因此須要額外存儲已經分配的長度大小(佔用 8 個字節)。可是對於元組,狀況就不一樣了,元組長度大小固定,且存儲元素不可變,因此存儲空間也是固定的。性能

讀者可能會問題,既然列表這麼強大,還要元組這種序列類型幹什麼?spa

經過對比列表和元組存儲方式的差別,咱們能夠引伸出這樣的結論,即元組要比列表更加輕量級,因此從整體上來講,元組的性能速度要因爲列表。操作系統

另外,Python 會在後臺,對靜態數據作一些資源緩存。一般來講,由於垃圾回收機制的存在,若是一些變量不被使用了,Python 就會回收它們所佔用的內存,返還給操做系統,以便其餘變量或其餘應用使用。指針

可是對於一些靜態變量(好比元組),若是它不被使用而且佔用空間不大時,Python 會暫時緩存這部份內存。這樣的話,當下次再建立一樣大小的元組時,Python 就能夠不用再向操做系統發出請求去尋找內存,而是能夠直接分配以前緩存的內存空間,這樣就能大大加快程序的運行速度。code

下面的例子,是計算初始化一個相同元素的列表和元組分別所需的時間。咱們能夠看到,元組的初始化速度要比列表快 5 倍。內存

C:\Users\mengma>python -m timeit 'x=(1,2,3,4,5,6)'
20000000 loops, best of 5: 9.97 nsec per loop
C:\Users\mengma>python -m timeit 'x=[1,2,3,4,5,6]'
5000000 loops, best of 5: 50.1 nsec per loop

固然,若是你想要增長、刪減或者改變元素,那麼列表顯然更優。由於對於元組來講,必須得經過新建一個元組來完成。

總的來講,元組確實沒有列表那麼多功能,可是元組依舊是很重要的序列類型之一,元組的不可替代性體如今如下這些場景中:

  1. 元組做爲不少內置函數和序列類型方法的返回值存在,也就是說,在使用某些函數或者方法時,它的返回值會元組類型,所以你必須對元組進行處理。
  2. 元組比列表的訪問和處理速度更快,所以,當須要對指定元素進行訪問,且不涉及修改元素的操做時,建議使用元組。
  3. 元組能夠在映射(和集合的成員)中當作「鍵」使用,而列表不行。這會在後續章節中做詳解介紹。
相關文章
相關標籤/搜索