元組和列表同屬序列類型,且均可以按照特定順序存放一組數據,數據類型不受限制,只要是 Python 支持的數據類型就能夠。那麼,元組和列表有哪些區別呢?python
元組和列表最大的區別就是,列表中的元素能夠進行任意修改,就比如是用鉛筆在紙上寫的字,寫錯了還能夠擦除重寫;而元組中的元素沒法修改,除非將元組總體替換掉,就比如是用圓珠筆寫的字,寫了就擦不掉了,除非換一張紙。緩存
須要注意的是,這樣的差別勢必會影響二者的存儲方式,咱們來直接看下面的例子:函數
>>> 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
固然,若是你想要增長、刪減或者改變元素,那麼列表顯然更優。由於對於元組來講,必須得經過新建一個元組來完成。
總的來講,元組確實沒有列表那麼多功能,可是元組依舊是很重要的序列類型之一,元組的不可替代性體如今如下這些場景中: