Skip to content

Python 3 - 元组

元组(tuple)是 Python 对象的有序序列。与列表类似,元组存储了元素的集合。然而,元组的决定性特征是其不可变性——一旦元组创建,其元素就不能被更改、添加或删除。

语法:元组通常通过列出逗号分隔的值来创建,可以选择用圆括号 () 括起来。

# 创建元组
tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5)
tup3 = "a", "b", "c", "d" # 圆括号是可选的
# 空元组
empty_tup = ()
# 包含单个元素的元组(需要末尾的逗号)
single_tup = (50,)
not_a_tuple = (50) # 根据圆括号的规则,这只是整数 50
print(type(single_tup)) # 输出: <class 'tuple'>
print(type(not_a_tuple)) # 输出: <class 'int'>

与列表和字符串一样,元组的索引从 0 开始。它们支持切片、拼接以及其他序列操作。

使用方括号 [] 结合索引或切片表示法来访问元组中的元素。

#!/usr/bin/env python3
tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7)
print(f"tup1[0]: {tup1[0]}")
print(f"tup2[1:5]: {tup2[1:5]}") # 从索引 1 开始(包含),直到索引 5(不包含)的元素
print(f"tup1[-1]: {tup1[-1]}") # 最后一个元素

输出:

tup1[0]: physics
tup2[1:5]: (2, 3, 4, 5)
tup1[-1]: 2000

元组是不可变的。元组创建后,你不能更改其中的元素。

#!/usr/bin/env python3
tup1 = (12, 34.56)
# 这个操作是无效的,会引发 TypeError:
# tup1[0] = 100 # TypeError: 'tuple' object does not support item assignment

但是,你可以通过拼接或切片现有元组来创建新的元组。

#!/usr/bin/env python3
tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
# 通过组合 tup1 和 tup2 创建一个新的元组
tup3 = tup1 + tup2
print(f"New combined tuple: {tup3}")

输出:

New combined tuple: (12, 34.56, 'abc', 'xyz')

由于元组是不可变的,你不能从元组中移除单个元素。

但是,你可以使用 del 语句删除整个元组变量。这会移除该名称与元组对象的绑定(如果没有其他引用存在,该对象可能会被垃圾回收)。

#!/usr/bin/env python3
tup_to_delete = ('physics', 'chemistry', 1997, 2000)
print(f"Before deletion: {tup_to_delete}")
del tup_to_delete
# 在删除后尝试访问 tup_to_delete 将会引发 NameError:
# print("After deleting tup:")
# print(tup_to_delete) # NameError: name 'tup_to_delete' is not defined

要有效地“移除”一个元素,你必须通过切片和拼接你想要保留的部分来创建一个新的元组。

#!/usr/bin/env python3
original_tup = (1, 2, 3, 4, 5)
# 创建一个不包含索引 2 处元素(值为 3)的新元组
new_tup = original_tup[:2] + original_tup[3:]
print(f"New tuple without element at index 2: {new_tup}") # 输出: (1, 2, 4, 5)

元组支持常见的序列操作:

Python 表达式结果描述
len((1, 2, 3))3长度(元素的数量)
(1, 2, 3) + (4, 5, 6)(1, 2, 3, 4, 5, 6)拼接(创建一个新的元组)
('Hi!',) * 4('Hi!', 'Hi!', 'Hi!', 'Hi!')重复(创建一个新的元组)
3 in (1, 2, 3)True成员测试
for x in (1, 2, 3): print(x, end=' ')1 2 3迭代
max((1, 5, 2))5最大值
min((1, 5, 2))1最小值

索引(访问单个元素)和切片(提取子序列)的工作方式与列表和字符串完全相同。

languages = ('C++', 'Java', 'Python', 'Go')
Python 表达式结果描述
languages[2]'Python'访问索引 2 处的元素(从 0 开始)
languages[-1]'Go'负数索引:从右边开始计数(-1 是最后一个元素)
languages[1:]('Java', 'Python', 'Go')切片:从索引 1 到末尾的元素
languages[:2]('C++', 'Java')切片:从开头直到(不包含)索引 2 的元素
languages[0:3:2]('C++', 'Python')带步长的切片:从索引 0 到 3,每隔 2 个元素取一个

在以下情况使用元组:

  • 你想确保数据创建后不能被更改(数据完整性)。
  • 你需要一个可以作为字典键或存储在集合中的序列(需要不可变元素)。
  • 你想表示一组固定的元素集合,比如坐标 (x, y) 或 RGB 颜色值。
  • 与列表相比,迭代时你可能会获得轻微的性能优势(尽管通常可以忽略不计)。

在以下情况使用列表:

  • 你需要一个可能需要增长、缩小或修改元素的集合。
  • 元素的顺序很重要,并且你需要像 append()、insert()、remove()、sort() 等方法。

Python 包含一个与元组相关的特定函数:

函数描述
tuple(iterable)将可迭代对象(如列表、字符串或 range)转换为元组。如果参数本身已经是元组,则返回原值。
#!/usr/bin/env python3
my_list = [1, 2, 3]
my_string = "abc"
tuple_from_list = tuple(my_list)
print(f"Tuple from list: {tuple_from_list}")
tuple_from_string = tuple(my_string)
print(f"Tuple from string: {tuple_from_string}")

输出:

Tuple from list: (1, 2, 3)
Tuple from string: ('a', 'b', 'c')