元组(Tuple) #

元组是Python中的不可变序列,一旦创建就不能修改。

一、创建元组 #

1.1 基本创建 #

python
# 空元组
empty = ()
empty = tuple()

# 带元素的元组
numbers = (1, 2, 3, 4, 5)
strings = ("apple", "banana", "cherry")
mixed = (1, "hello", 3.14, True)

# 单元素元组(注意逗号)
single = (1,)      # 元组
not_tuple = (1)    # 整数,不是元组
print(type(single))    # <class 'tuple'>
print(type(not_tuple)) # <class 'int'>

# 省略括号
coordinates = 10, 20, 30
print(type(coordinates))  # <class 'tuple'>

1.2 使用tuple()函数 #

python
# 从其他可迭代对象创建
tuple_from_list = tuple([1, 2, 3])     # (1, 2, 3)
tuple_from_string = tuple("hello")     # ('h', 'e', 'l', 'l', 'o')
tuple_from_range = tuple(range(3))     # (0, 1, 2)

二、访问元素 #

2.1 索引访问 #

python
fruits = ("apple", "banana", "cherry", "date")

# 正向索引
print(fruits[0])   # "apple"
print(fruits[2])   # "cherry"

# 反向索引
print(fruits[-1])  # "date"
print(fruits[-2])  # "cherry"

2.2 切片操作 #

python
numbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

print(numbers[2:5])    # (2, 3, 4)
print(numbers[:3])     # (0, 1, 2)
print(numbers[7:])     # (7, 8, 9)
print(numbers[::2])    # (0, 2, 4, 6, 8)
print(numbers[::-1])   # (9, 8, 7, 6, 5, 4, 3, 2, 1, 0)

三、元组不可变性 #

3.1 不能修改 #

python
fruits = ("apple", "banana", "cherry")

# 不能修改元素
# fruits[0] = "orange"  # TypeError

# 不能添加元素
# fruits.append("date")  # AttributeError

# 不能删除元素
# del fruits[0]  # TypeError

3.2 可变元素的处理 #

python
# 元组包含可变元素时,可变元素可以修改
person = ("Tom", 25, ["Python", "JavaScript"])

# 不能修改元组本身
# person[0] = "Jerry"  # TypeError

# 但可以修改内部的列表
person[2].append("Go")
print(person)  # ('Tom', 25, ['Python', 'JavaScript', 'Go'])

person[2][0] = "Rust"
print(person)  # ('Tom', 25, ['Rust', 'JavaScript', 'Go'])

四、元组解包 #

4.1 基本解包 #

python
# 变量解包
point = (10, 20)
x, y = point
print(x, y)  # 10 20

# 交换变量
a, b = 1, 2
a, b = b, a
print(a, b)  # 2 1

# 函数返回多个值
def get_stats(numbers):
    return min(numbers), max(numbers), sum(numbers)

minimum, maximum, total = get_stats([1, 2, 3, 4, 5])
print(minimum, maximum, total)  # 1 5 15

4.2 扩展解包 #

python
# 星号表达式
numbers = (1, 2, 3, 4, 5)

first, *rest = numbers
print(first)  # 1
print(rest)   # [2, 3, 4, 5]

*beginning, last = numbers
print(beginning)  # [1, 2, 3, 4]
print(last)       # 5

first, *middle, last = numbers
print(first)   # 1
print(middle)  # [2, 3, 4]
print(last)    # 5

4.3 嵌套解包 #

python
# 嵌套元组解包
nested = (1, (2, 3), 4)
a, (b, c), d = nested
print(a, b, c, d)  # 1 2 3 4

# 三维坐标
point_3d = (1, (2, 3), 4)
x, (y, z), w = point_3d

五、元组方法 #

5.1 count和index #

python
numbers = (1, 2, 3, 2, 4, 2, 5)

# count:统计出现次数
print(numbers.count(2))  # 3
print(numbers.count(6))  # 0

# index:查找索引
print(numbers.index(3))      # 2
print(numbers.index(2, 2))   # 3(从索引2开始查找)
# numbers.index(6)  # ValueError

5.2 长度和成员检查 #

python
fruits = ("apple", "banana", "cherry")

# 长度
print(len(fruits))  # 3

# 成员检查
print("apple" in fruits)   # True
print("orange" in fruits)  # False

六、元组运算 #

6.1 拼接 #

python
a = (1, 2, 3)
b = (4, 5, 6)

# 使用 +
c = a + b
print(c)  # (1, 2, 3, 4, 5, 6)

# 使用 +=(创建新元组)
a += b
print(a)  # (1, 2, 3, 4, 5, 6)

6.2 重复 #

python
# 使用 *
zeros = (0,) * 5
print(zeros)  # (0, 0, 0, 0, 0)

6.3 比较运算 #

python
# 相等比较
print((1, 2, 3) == (1, 2, 3))  # True
print((1, 2, 3) == (3, 2, 1))  # False

# 大小比较(字典序)
print((1, 2) < (1, 3))   # True
print((1, 2) < (1, 2, 3))  # True

七、元组与列表转换 #

7.1 相互转换 #

python
# 元组转列表
tuple_data = (1, 2, 3)
list_data = list(tuple_data)
print(list_data)  # [1, 2, 3]

# 列表转元组
list_data = [1, 2, 3]
tuple_data = tuple(list_data)
print(tuple_data)  # (1, 2, 3)

7.2 何时使用元组 #

python
# 使用元组的场景:

# 1. 数据不应该被修改
days = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")

# 2. 函数返回多个值
def get_position():
    return (10, 20)

# 3. 字典的键(列表不能作为键)
locations = {
    (0, 0): "Origin",
    (1, 0): "Point A",
    (0, 1): "Point B"
}

# 4. 常量配置
HTTP_STATUS = (200, 404, 500)

八、命名元组 #

8.1 基本使用 #

python
from collections import namedtuple

# 定义命名元组
Point = namedtuple('Point', ['x', 'y'])
Person = namedtuple('Person', 'name age city')

# 创建实例
p = Point(10, 20)
print(p.x, p.y)  # 10 20
print(p[0], p[1])  # 10 20(仍然可以用索引)

person = Person("Tom", 25, "Beijing")
print(person.name)   # Tom
print(person.age)    # 25
print(person.city)   # Beijing

8.2 命名元组方法 #

python
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)

# _asdict:转为字典
print(p._asdict())  # {'x': 10, 'y': 20}

# _replace:创建新实例(替换字段)
p2 = p._replace(x=30)
print(p2)  # Point(x=30, y=20)

# _fields:字段名
print(Point._fields)  # ('x', 'y')

# _make:从可迭代对象创建
p3 = Point._make([5, 10])
print(p3)  # Point(x=5, y=10)

九、元组应用场景 #

9.1 函数返回多值 #

python
def find_min_max(numbers):
    return min(numbers), max(numbers)

minimum, maximum = find_min_max([1, 2, 3, 4, 5])

9.2 多重赋值 #

python
# 优雅地交换变量
a, b = 1, 2
a, b = b, a

# 遍历字典项
person = {"name": "Tom", "age": 25}
for key, value in person.items():
    print(f"{key}: {value}")

9.3 作为字典键 #

python
# 坐标作为键
grid = {
    (0, 0): "A",
    (0, 1): "B",
    (1, 0): "C"
}
print(grid[(0, 0)])  # "A"

9.4 格式化字符串 #

python
# 旧式格式化
point = (10, 20)
print("坐标:%s" % (point,))  # 注意逗号
print("坐标:(%d, %d)" % point)

十、总结 #

特点 说明
不可变 创建后不能修改
有序 元素有固定顺序
允许重复 可以有相同元素
异构 可以存储不同类型
可哈希 可作为字典键(元素都可哈希时)

元组 vs 列表:

特性 元组 列表
可变性 不可变 可变
语法 () []
方法 count(), index() 更多方法
速度 更快 稍慢
内存 更小 更大
字典键 可以 不可以

使用建议:

  • 数据不应改变时使用元组
  • 需要修改时使用列表
  • 作为字典键时使用元组
  • 函数返回多值时使用元组
最后更新:2026-03-16