Python 入门:何时以及如何使用元组(Tuples)

更新于 2026-01-13

Jack Wallen 2022-03-30

Python 是一门功能强大且灵活的编程语言。它同时也是初学者的最佳选择之一,不仅因为其易于学习,还因为它不需要复杂的编译器,而是使用解释器来运行程序。因此,你无需编写程序、编译后再运行……只需编写完代码,直接运行即可。

在大多数情况下,Python 的概念都相当容易理解。我们之前已经介绍了从文件中读取文本、Range 函数、数据类型,以及其他围绕这门用户友好型语言的众多概念。

但并非所有概念都那么直观易懂,元组(tuple)就是其中之一。元组是一种可以容纳多个项目的单一变量。一旦你理解了它的作用,就会发现它其实非常简单易用。与 Python 中的集合(sets)、列表(lists)和字典(dictionaries)一样,元组也是一种内置的数据类型,但比其他几种类型运行得更快。

话虽如此,让我们一起来了解什么是元组,以及如何编写和使用它们。

什么是元组?

用最简单的话来说,Python 元组类似于列表,是一种定义多个变量的简便方式。

例如,如果不使用元组或列表,你可能会这样定义变量:

color1 = "blue"
color2 = "green"
color3 = "red"
color4 = "yellow"

然后你可以像这样打印出这些变量:

print(color1, color2, color3, color4)

这样做当然没问题,但使用列表会更加高效。要达到同样的效果,颜色列表可以写成这样:

color = ['blue', 'green', 'red', 'yellow']

然后你可以这样打印列表中的元素:

print(color[0], color[1], color[2], color[3])

使用列表能更高效地定义相似的变量。

与列表类似,元组也是一种值的集合,但使用圆括号 () 来声明。因此,与其使用这样的列表:

names = ['Olivia', 'Nathan', 'Bethany', 'Jacob']

不如将元组格式化为这样:

names = ('Olivia', 'Nathan', 'Bethany', 'Jacob')

除了明显的 []() 语法差异之外,元组和列表有什么区别呢?简单来说,列表中的元素在赋值后是可以被修改的,而元组则不能被修改。

想从 Python 解释器的角度看看两者的区别吗?在安装了 Python 的机器上打开一个终端窗口,并通过以下命令进入 Python 控制台:

python3

输入:

names_l = ['Olivia', 'Nathan', 'Bethany', 'Jacob']

再输入:

names_t = ('Olivia', 'Nathan', 'Bethany', 'Jacob')

接着输入:

print(type(names_l))

按下回车键,你应该会看到:

<class 'list'>

再输入:

print(type(names_t))

按下回车键,你应该会看到:

<class 'tuple'>

到目前为止,对程序员而言,两者之间的差别似乎微乎其微。然而,使用元组而非列表的一个关键原因是:列表不能用作字典的键(因为列表是可变的)

等等,你说的“字典”是什么?Python 字典类似于列表,也是一种数据集合。字典是 Python 对关联数组(associative arrays)的实现,使用键值对(key-value pairs),例如:

NBA_TEAM = {
    'Indiana': 'Pacers',
    'Boston': 'Celtics',
    'Los Angeles': 'Lakers',
    'Milwaukee': 'Bucks'
}

你可以像这样打印出整个字典:

print(NBA_TEAM)

元组的类型

你可以使用四种不同类型的元组。

首先是空元组,写法如下:

empty_tuple = ()

打印这个元组(使用命令 print(empty_tuple)),你只会看到输出为 ()

第二种是包含整数的元组,如下所示:

integer_tuple = (1, 2, 3)

打印该元组,你会看到:

(1, 2, 3)

第三种是包含混合数据类型的元组,可能如下所示:

mixed_tuple = (0, "Hello", 1.2, "World!")

打印该元组,你会看到类似这样的输出:

(0, 'Hello', 1.2, 'World!')

最后一种是嵌套元组,即元组中包含另一个元组,如下所示:

nested_tuple = ("aardvark", [0, 1, 2], (2, 1, 0))

正如你所预料的那样,print(nested_tuple) 的输出看起来会是这样:

('aardvark', [0, 1, 2], (2, 1, 0))

访问元组元素

这里元组可能会变得有点棘手。我们先创建一个基本的元组:

tns_tuple = ('N', 'e', 'w', 'S', 't', 'a', 'c', 'k')

现在,执行以下命令:

print(tns_tuple[0])

你应该会看到输出为:

N

记住,在 Python 中,计数是从 0 开始的,所以字母 “N” 位于元组的第 0 个位置。

当你需要索引一个嵌套元组时,情况会稍微复杂一些。我们创建如下嵌套元组:

n_tuple = ("kubernetes", "cloud native", [8, 6, 7, 5, 3, 0, 9])

现在,我们要从这个嵌套元组中访问不同的元素。由于它是嵌套的,实际上我们创建了三个元素:

  • 元素 0:"kubernetes"
  • 元素 1:"cloud native"
  • 元素 2:[8, 6, 7, 5, 3, 0, 9]

如果我想打印出元素 0(即字符串 "kubernetes")中的第 3 个字符(也就是字母 “e”),我可以执行以下命令:

print(n_tuple[0][3])

我在这里告诉 Python 解释器:打印第一个元组(索引为 0)中第 3 个位置的值。

我们还可以通过“切片(slicing)”来访问元组中的一系列元素。切片使用冒号 : 来完成。回到我们之前的基本元组:

tns_tuple = ('N', 'e', 'w', 'S', 't', 'a', 'c', 'k')

要打印前三个元素,我们可以这样做:

print(tns_tuple[0:3])

该命令将输出:

('N', 'e', 'w')

要打印最后五个元素,命令应为:

print(tns_tuple[3:8])

上述命令将输出:

('S', 't', 'a', 'c', 'k')

我们还可以对元组进行**拼接(concatenation)重复(repetition)**操作。拼接使用 + 运算符,如下所示:

print(('T', 'h', 'e') + ('N', 'e', 'w') + ('S', 't', 'a', 'c', 'k'))

拼接后的元组输出如下:

('T', 'h', 'e', 'N', 'e', 'w', 'S', 't', 'a', 'c', 'k')

重复操作则使用 * 运算符,例如:

print(("The New Stack",) * 3)

上述命令的输出如下:

('The New Stack', 'The New Stack', 'The New Stack')

最后,元组还有一个非常实用的功能:统计和查找元素。我们回到基本元组,并稍作扩展:

tns_tuple = ('N', 'e', 'w', 'S', 't', 'a', 'c', 'k', 'R', 'o', 'k', 's')

假设你想统计元组中有多少个字母 'k',可以这样做:

print(tns_tuple.count('k'))

上述命令的输出将是 2,因为元组中有两个 'k'。但这两个 'k' 分别位于什么位置呢?我们可以用以下命令查找:

print(tns_tuple.index('k'))

啊,这里出现了一个问题。上述命令只会输出 7 并停止,不会继续查找。这是因为 tuple.index() 方法的设计初衷就是只返回第一个匹配项的索引。

为了找到第二个 'k' 的位置,我们需要使用一点小技巧:

i = tns_tuple.index('k')
tns_tuple.index('k', i + 1)

这应该会输出:

10

以上就是你对 Python 元组的入门介绍。记得回顾本系列的其他文章,并持续关注 The New Stack,获取更多 Python 精彩内容!