Python 選列表 list 還是元組 tuple 的思考

ponponon發表於2023-02-17

list 和 tuple 最大的區別就是:前者是可變物件、後者是不可變物件

以及可變、不可變帶來的記憶體區別:list 為了擴容,會多申請一些記憶體,所以 list 的記憶體使用也會比 tuple 多。(tuple 是用多少申請多少)


除了上面人盡皆知的區別,還有一個區別:typing hint

現在寫 python 程式碼如果還不加 typing hint 的話,就太過分了!

先說結論

如果元素的 type 都是一樣的,就用 list
如果元素的 type 是不一樣的,就用 tuple

舉一個例子:



def handle(user_id: int) -> tuple[bool, str]:
    if user_id == 0:
        return False, '沒有這個使用者'
    else:
        return True, '有這個使用者'


exist, message = handle(0)

比如上面的函式,返回第一個元素是 bool 型別,第二個元素是字串型別,這種情況,用元組就能很好的描述

返回的元組要是定長,不能一個條件裡面返回的 len 是 2,另一個條件返回的是 len 是 3

把游標放在 exist 上,ide 就能智慧提示告訴你,型別是 bool
圖片.png

把游標放在 message 上,ide 就能智慧提示告訴你,型別是 str
圖片.png

如果用 list,能不能做到這件事情?不能

來看看如果使用 list 會是什麼結果

def handle(user_id: int) -> list[bool, str]:
    if user_id == 0:
        return False, '沒有這個使用者'
    else:
        return True, '有這個使用者'


exist, message = handle(0)

如果我們把返回型別從 tuple[bool, str] 改成 list[bool, str]

此時 exist 的提示還是 bool 型別

圖片.png

但是 message 就出問題了,message 應該是 str 型別,但是 ide 給的提示是 bool 型別

圖片.png

換種寫法,把 list[bool, str] 改成 list[bool | str] 會如何?

def handle(user_id: int) -> list[bool | str]:
    if user_id == 0:
        return False, '沒有這個使用者'
    else:
        return True, '有這個使用者'


exist, message = handle(0)

結果當然是更不行

圖片.png

不管是 exist 還是 message 都變成 bool | str

圖片.png

相關文章