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


universe_king
3.4k 声望680 粉丝