列表(List)和元组(Tuple)以特定顺序存储一个或多个对象或值。存储在列表或元组中的对象可以是任何类型,包括由 None 关键字定义的无类型。
列表和元组在大多数情况下是相似的,但它们之间存在一些差异,我们将在本文中探讨。
语法差异
列表和元组的语法略有不同。列表用方括号 []
括起来,而元组用圆括号 ()
括起来。
示例 1.1:创建列表与创建元组
list_num = [1,2,3,4]
tup_num = (1,2,3,4)
print(list_num)
print(tup_num)
输出
[1,2,3,4] (1,2,3,4)
上面我们定义了一个名为 list_num 的变量,它包含一个从 1
到 4
的数字列表。该列表用方括号 []
括起来。同样,我们定义了一个变量 tup_num;它包含一个从 1
到 4
的数字元组。该元组用圆括号 ()
括起来。
在 Python 中,我们有 type()
函数,它返回创建的对象的类型。
示例 1.2:使用 type() 函数查找数据结构类型
type(list_num)
type(tup_num)
输出
list tuple
可变列表与不可变元组
列表具有可变性,即列表在创建后可以根据需要进行更改或修改,而元组具有不可变性,即元组在创建后无法更改或修改。
示例 2.1:修改列表项与元组项
list_num[2] = 5
print(list_num)
tup_num[2] = 5
输出
[1,2,5,4] Traceback (most recent call last): File "python", line 6, in <module> TypeError: 'tuple' object does not support item assignment
在上面的代码中,我们将 5
赋值给 list_num 的索引 2
处,并在输出中在索引 2
处找到了 5
。同样,我们将 5
赋值给 tup_num 的索引 2
处,但我们得到了 type error
。由于元组的不可变性,我们无法修改它。
注意:由于元组是不可变的,因此它们的大小是固定的,而列表的大小是可变的。
可用操作
列表比元组拥有更多的内置函数。我们可以使用 dir([object])
内置函数来获取列表和元组的所有相关函数。
示例 3.1:列出目录
dir(list_num)
输出
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
示例 3.2:元组目录
dir(tup_num)
输出
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
我们可以清楚地看到,与元组相比,列表有许多额外的功能。我们可以使用内置函数对列表进行插入和弹出操作,删除和排序元素,而这些在元组中是不可用的。
大小比较
元组操作的大小比列表小,这使得它稍微快一些,但如果元素数量不大,这种速度差异并不值得一提。
示例 5.1:计算列表与元组的大小
a= (1,2,3,4,5,6,7,8,9,0)
b= [1,2,3,4,5,6,7,8,9,0]
print('a=',a.__sizeof__())
print('b=',b.__sizeof__())
输出
a= 104 b= 120
在上面的代码中,我们有元组 a 和列表 b,它们包含相同的项目,但元组的大小小于列表。
不同的用例
乍一看,列表似乎总是可以替代元组。但元组是非常有用的数据结构
- 使用元组而不是列表可以向程序员和解释器暗示数据不应更改。
- 元组通常用作没有键的字典的等价物来存储数据。例如,
[('Swordfish', 'Dominic Sena', 2001), ('Snowden', ' Oliver Stone', 2016), ('Taxi Driver', 'Martin Scorsese', 1976)]
上面的示例包含列表中的元组,其中包含电影列表。
- 当元组存储在列表中时,读取数据更简单。例如,
[(2,4), (5,7), (3,8), (5,9)]
比[[2,4], [5,7], [3,8], [5,9]]
元组由于其可哈希和不可变性,也可以用作字典的键,而列表不能用作字典的键,因为列表无法处理 __hash__()
并且具有可变性。
key_val= {('alpha','bravo'):123} #Valid
key_val = {['alpha','bravo']:123} #Invalid
要记住的关键点
- 元组的字面语法用圆括号
()
表示,而列表的字面语法用方括号[]
表示。 - 列表的长度可变,元组的长度固定。
- 列表具有可变性,元组具有不可变性。
- 列表比元组具有更多的功能。