“列表(list)与元组(tuple)两种数据类型有哪些区别”这个问题在初级程序员面试中经常碰到,超出面试官预期的答案往往能加不少印象分,也会给后续面试顺利进行提供一定帮助,这道题主要考察候选人对Python基本数据结构的掌握程度,属于简单类型的送分题,那么该如何来回答才不至于丢分?

相同点:都是序列类型

回答它们的区别之前,先来说说两者有什么相同之处。list 与tuple 都是序列类型的容器对象,可以存放任何类型的数据、支持切片、迭代等操作
>>>foos=[0,1,2,3,4,5,6,7,8,9]>>>foos[0:10:2][0,2,4,6,8]>>>bars=(0,1,2,3,4,5,6,7,8,9)>>>bars[1:10:2](1,3,5,7,9)
两者的操作如此相似,Python 为什么还要设计出 tuple 这种类型出来呢?这就要从它们的不同之处来寻找答案。

不同点一:不可变 VS 可变

两种类型除了字面上的区别(括号与方括号)之外,最重要的一点是tuple是不可变类型,大小固定,而list 是可变类型、数据可以动态变化,这种差异使得两者提供的方法、应用场景、性能上都有很大的区别。
列表特有方法:
>>>foo=[2,3,1,9,4]>>>foo.sort()# 排序>>>foo.insert(5,10)# 插入>>>foo.reverse()# 反转>>>foo.extend([-1,-2])# 扩展>>>foo.remove(10)# 移除>>>foo.pop()# 弹出最后一个元素>>>foo.append(5)# 追加
所有的操作都基于原来列表进行更新,而tuple 作为一种不可变的数据类型,同样大小的数据,初始化和迭代 tuple 都要快于 list
>python-mtimeit"[1,2,3,4,5]"10000000loops,bestof3:0.123usecperloop>python-mtimeit"(1,2,3,4,5)"100000000loops,bestof3:0.0166usecperloop
同样大小的数据,tuple 占用的内存空间更少
>>>foo=tuple(range(1000))>>>bar=list(range(1000))>>>foo.__sizeof__()8024>>>bar.__sizeof__()9088
原子性的 tuple 对象还可作为字典的键
>>>foo=(1,(2,3))>>>d={foo:1}>>>bar=(1,[2,3])# 非原子性tuple,因为元组中包含有不可哈希的list>>>d={bar:1}Traceback(mostrecentcalllast):File"",line1,in