Python 列表与元组

列表(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 的变量,它包含一个从 14 的数字列表。该列表用方括号 [] 括起来。同样,我们定义了一个变量 tup_num;它包含一个从 14 的数字元组。该元组用圆括号 () 括起来。

在 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,它们包含相同的项目,但元组的大小小于列表。


不同的用例

乍一看,列表似乎总是可以替代元组。但元组是非常有用的数据结构

  1. 使用元组而不是列表可以向程序员和解释器暗示数据不应更改。
     
  2. 元组通常用作没有键的字典的等价物来存储数据。例如,
    [('Swordfish', 'Dominic Sena', 2001), ('Snowden', ' Oliver Stone', 2016), ('Taxi Driver', 'Martin Scorsese', 1976)]
    上面的示例包含列表中的元组,其中包含电影列表。
     
  3. 当元组存储在列表中时,读取数据更简单。例如,
    [(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

要记住的关键点

  1. 元组的字面语法用圆括号 () 表示,而列表的字面语法用方括号 [] 表示。
  2. 列表的长度可变,元组的长度固定。
  3. 列表具有可变性,元组具有不可变性。
  4. 列表比元组具有更多的功能。
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战