列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的,而不可变的列表被称为元组

4.5.1 定义元组

元组看起来犹如列表,但使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。

例如,如果有一个大小不应改变的矩形,可将其长度和宽度存储在一个元组中,从而确保它们是不能修改的:

  1. # dimensions.py
  2. rectangle = (40, 20)
  3. print(rectangle[0])
  4. print(rectangle[1])

我们首先定义了元组rectangle,为此我们使用了圆括号而不是方括号。接下来,我们分别打印该元组的各个元素,使用的语法与访问列表元素时使用的语法相同:
40
20

下面来尝试修改元组rectangle中的一个元素,看看结果如何:

# dimensions.py
rectangle = (40, 20)
rectangle[0] = 100

上面的代码试图修改第一个元素的值,导致Python返回类型错误消息。由于试图修改元组的操作是被禁止的,因此Python指出不能给元组的元素赋值:
Traceback (most recent call last):
File “dimensions.py”, line 3, in
rectangle[0] = 100
TypeError: ‘tuple’ object does not support item assignment

代码试图修改矩形的尺寸时,Python报告错误,这很好,因为这正是我们希望的。

4.5.2 遍历元组中的所有值

像列表一样,也可以使用for循环来遍历元组中的所有值:

# dimensions.py
rectangle = (40, 20)
for rect in rectangle:
    print(rect)

就像遍历列表时一样,Python返回元组中所有的元素:
40
20

4.5.3 修改元组变量

虽然不能修改元组的元素,但可以给存储元组的变量赋值。因此,如果要修改前述矩形的尺寸,可重新定义整个元组:

# dimensions.py
rectangle = (40, 20)
print('原始矩形:')
for rect in rectangle:
    print(rect)
rectangle = (100, 50)
print('修改后矩形:')
for rect in rectangle:
    print(rect)

我们首先定义了一个元组,并将其存储的尺寸打印了出来;接下来,将一个新元组存储到变量rectangle;然后,打印新的尺寸。这次,Python不会报告任何错误,因为给元组变量赋值是合法的:
原始矩形:
40
20
修改后矩形:
100
50

相比于列表,元组是更简单的数据结构。如果需要存储的一组值在程序的整个生命周期内都不变,可使用元组。