matplotlib教學 - scatter plot python




列表和元組有什麼區別? (10)

有什麼不同?

元組/列表有什麼優點/缺點?


PEP 484-Type Hints指出tuple的元素類型可以單獨輸入; 所以你可以說Tuple[str, int, float] ; 但是一個帶有List類的List只能使用一個類型參數: List[str] ,這意味著2的區別實際上是前者是異構的,而後者本質上是同類的。

而且,標準庫通常使用元組作為C返回struct標準函數的返回值。


列表的值可以隨時更改,但元組的值不能更改。

優點和缺點取決於使用情況。 如果你有這樣一個你永遠不想改變的數據,那麼你應該使用元組,否則列表是最好的選擇。


列表和元組之間的區別

  1. 文字

    someTuple = (1,2)
    someList  = [1,2] 
    
  2. 尺寸

    a = tuple(range(1000))
    b = list(range(1000))
    
    a.__sizeof__() # 8024
    b.__sizeof__() # 9088
    

    由於元組操作的規模較小,它會變得更快一些,但是除非您有大量元素,否則不會提及。

  3. 允許的操作

    b    = [1,2]   
    b[0] = 3       # [3, 2]
    
    a    = (1,2)
    a[0] = 3       # Error
    

    這也意味著你不能刪除一個元素或排序一個元組。 但是,您可以將新元素添加到列表和元組中,唯一的區別是您將通過添加元素來更改元組的id

    a     = (1,2)
    b     = [1,2]  
    
    id(a)          # 140230916716520
    id(b)          # 748527696
    
    a   += (3,)    # (1, 2, 3)
    b   += [3]     # [1, 2, 3]
    
    id(a)          # 140230916878160
    id(b)          # 748527696
    
  4. 用法

    由於列表是可變的,它不能用作字典中的鍵,而可以使用元組。

    a    = (1,2)
    b    = [1,2] 
    
    c = {a: 1}     # OK
    c = {b: 1}     # Error
    

列表旨在是同構序列,而元組是異構數據結構。


列表是可變的,元組是不可變的。 只要考慮這個例子。

a = ["1", "2", "ra", "sa"]    #list
b = ("1", "2", "ra", "sa")    #tuple

現在改變列表和元組的索引值。

a[2] = 1000
print a     #output : ['1', '2', 1000, 'sa']
b[2] = 1000
print b     #output : TypeError: 'tuple' object does not support item assignment.

因此證明下面的代碼對於元組是無效的,因為我們試圖更新一個不允許的元組。


列表是可變的,元組是不可變的。 當你試圖添加一個項目時,可變內存和不可變內存的主要區別在於內存使用情況。

當你創建一個變量時,一些固定的內存被分配給變量。 如果它是一個列表,分配的內存比實際使用的多。 例如,如果當前的內存分配是100字節,當你想追加第101個字節時,可能會分配另外100個字節(在這種情況下總共200字節)。

但是,如果你知道你不經常添加新元素,那麼你應該使用元組。 元組精確分配所需內存的大小,從而節省內存,特別是在使用大塊內存時。


如果你去散步,你可以在任何時刻在(x,y)元組中記下你的坐標。

如果你想記錄你的旅程,你可以每隔幾秒將你的位置追加到列表中。

但是你不能以相反的方式去做。


有人提到 ,差異主要是語義上的:人們期望一個元組和列表來表示不同的信息。 但是這比一個準則更進一步。 一些圖書館的行為基於他們傳遞的內容而有所不同。 以NumPy為例(從另一篇帖子中復制我要求更多的例子):

>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
       [3, 4, 5]])

重點是,儘管NumPy可能不是標準庫的一部分,但它是一個主要的 Python庫,在NumPy列表和元組中是完全不同的東西。


關鍵的區別是元組是不可變的。 這意味著一旦創建它就不能更改元組中的值。

因此,如果您需要更改值,請使用List。

對元組的好處:

  1. 性能略有改善。
  2. 作為一個元組是不可變的,它可以用作字典中的一個鍵。
  3. 如果你不能改變任何人,也就是說你不需要擔心任何API函數等等,在不被詢問的情況下改變你的元組。

除了元組是不可變的,還有一個應該引導它們用法的語義區別。 元組是異構數據結構(即它們的條目具有不同的含義),而列表是同類序列。 元組有結構,列表有順序。

使用這種區別使代碼更加明確和易於理解。

一個例子是成對的頁面和行號來引用書中的位置,例如:

my_location = (42, 11)  # page number, line number

然後,您可以將其用作字典中的關鍵字來存儲位置的註釋。 另一方面,列表可用於存儲多個位置。 當然,人們可能希望添加或刪除列表中的位置,所以列表是可變的是有意義的。 另一方面,從現有位置添加或移除項目是沒有意義的 - 因此元組是不可變的。

可能會出現您想要更改現有位置元組內的項目的情況,例如,在遍歷頁面行時。 但是元組的不變性迫使你為每個新值創建一個新的位置元組。 這看起來似乎很不方便,但像這樣使用不可變的數據是價值類型和函數式編程技術的基石,它們可能具有相當大的優勢。

在這個問題上有一些有趣的文章,例如“Python元組不僅僅是常量列表”或者“在Python中理解元組與列表” 。 官方的Python文檔也提到了這一點“元組是不可變的,通常包含一個異構的序列......” )。

在像Haskell這樣的靜態類型語言中,元組中的值通常具有不同的類型,並且元組的長度必須是固定的。 在一個列表中,這些值都具有相同的類型,並且長度不固定。 所以差別非常明顯。

最後是Python中的namedtuple ,這是有道理的,因為元組已經被認為具有結構。 這強調了元組是類和實例的輕量級替代的想法。





tuples