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
把游標放在 message 上,ide 就能智慧提示告訴你,型別是 str
如果用 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 型別
但是 message 就出問題了,message 應該是 str 型別,但是 ide 給的提示是 bool 型別
換種寫法,把 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)
結果當然是更不行
不管是 exist 還是 message 都變成 bool | str
了