元组(tuple)是 Python 中另一个重要的序列结构,与列表类似,也是由一系列按特定顺序排列的元素组成。但是,它为不可变序列。因此,元组也可以称为不可变的列表。在形式上,元组的所有元素都放在一对小括号“”中,两个相邻元素间使用逗号“,”分隔;在内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放入元组中,并且在同一个元组中,元素的类型可以不同,因为它们之间没有任何关系。通常情况下,元组用于保存程序中不可修改的内容。

一、元组的创建和删除

使用赋值运算符直接创建元组

同其它类型的Python变量一样,创建元组时,也可以使用赋值运算符 " = " 直接将一个元组赋值给变量。语法格式如下:

tuplename = (element 1,element 2,element 3,element 4,element 5...)

其中,tuplename表示元组的名称,可以是任何符合Python命令规则的标识符;element n 表示元组中的元素,个数没有限制,并且只要是Python支持的数据类型就可以。
例如:

person = ("张三", 28, 175.5, ["篮球", "阅读"])

创建元组的语法和创建列表的语法类似,只是创建列表时使用的中括号“ [] ”,而创建元组时使用的是小括号“ ()”

创建空元组

在Python中,也可以创建空元组,代码如下:

empty_tuple = ()

当需要向函数传递一个空值或者函数需要返回空值时,可以使用空元组。空元组常用于函数需要返回空结果、或作为占位符的场景。

创建单元素元组

当元组中只有一个元素时,必须在元素后添加一个逗号 ,,以区别于普通括号表达式:

single_tuple = (5,)      # 这是一个元组
not_a_tuple = (5)        # 这是整数 5,不是元组

如果不加逗号,Python 会将 (5) 解释为整数 5,这是一个常见的易错点。

使用 tuple() 函数创建元组

tuple() 是一个内置函数,可以将任何可迭代对象(如字符串、列表、range 对象、集合等)转换为元组:

tuple(iterable)

示例:

# 将 range 对象转换为元组
num_tuple = tuple(range(5))          # (0, 1, 2, 3, 4)

# 将字符串转换为元组
char_tuple = tuple("hello")          # ('h', 'e', 'l', 'l', 'o')

# 将列表转换为元组
list_tuple = tuple([1, 2, 3])        # (1, 2, 3)

# 将生成器表达式转换为元组
gen_tuple = tuple(x**2 for x in range(4))  # (0, 1, 4, 9)

使用tuple()函数不仅能通过range对象创建元组,还可以通过其他对象创建元组。

使用逗号分隔创建(省略括号)

Python 允许在赋值时省略小括号,只使用逗号分隔元素,这样也会创建一个元组:

t = 1, 2, 3          # 等价于 (1, 2, 3)
print(type(t))       # <class 'tuple'>

这种语法在函数返回多个值、或交换变量值时非常常见。

删除元组

当不再使用已经创建的元组时,可以使用del语句删除它。其语法格式如下:

del tuplename

其中,tuplename是要删除元组的名称

二、访问元组元素

元组支持通过索引和切片来访问其元素,操作方式与字符串一致。

索引访问

使用方括号加整数索引(从 0 开始)获取单个元素,也支持负数索引(从 -1 开始倒数):

my_tuple = (10, 20, 30, 40, 50)
print(my_tuple[0])   # 10
print(my_tuple[3])   # 40
print(my_tuple[-1])  # 50(最后一个元素)

切片访问

使用 [start:stop:step] 获取子元组,返回结果仍是一个元组:

print(my_tuple[1:4])   # (20, 30, 40)
print(my_tuple[::2])   # (10, 30, 50)  步长为2
print(my_tuple[::-1])  # (50, 40, 30, 20, 10)  逆序

遍历元组

可以使用 for 循环逐个访问元组中的元素:

for item in my_tuple:
    print(item)

直接输出整个元组

使用 print() 函数可以直观地查看元组内容:

print(my_tuple)   # (10, 20, 30, 40, 50)

三、元组的特性与高级用法

不可变性及其深层含义

元组的“不可变”是指:元组对象一旦创建,其元素引用的个数和顺序不能被改变。你不能添加、删除或替换其中的元素。

但是,如果元组的元素本身是可变对象(例如列表、字典),那么这些对象的内容是可以改变的。因为元组存储的是对象的引用(地址),而非对象的值。只要引用不变,元组结构就没有变化。

t = (1, [2, 3], 4)
# t[1] = [5, 6]      # 错误!不能替换元素
t[1].append(99)      # 可以!修改列表内容
print(t)             # (1, [2, 3, 99], 4)

这种特性使得元组在需要固定结构但内部数据可能变化时非常灵活,但也需要注意,这种“半可变”行为可能带来意外。

元组的解包(Unpacking)

元组解包是一种非常强大的特性,可以将元组中的元素分别赋值给多个变量:

info = ("Alice", 25, "Engineer")
name, age, job = info
print(name)   # Alice
print(age)    # 25
print(job)    # Engineer

解包时,变量数量必须与元组长度一致,否则会引发 ValueError。但可以使用星号表达式 * 来收集剩余元素:

first, *rest = (1, 2, 3, 4)
print(first)   # 1
print(rest)    # [2, 3, 4]  注意:rest 是列表

*head, last = (1, 2, 3, 4)
print(head)    # [1, 2, 3]
print(last)    # 4

解包在交换变量值、函数返回多个值等场景中非常常用:

a, b = b, a      # 交换变量值,本质上是元组打包和解包

四、元组与列表的区别

元组和列表都属于序列,而且它们又可以按照特定顺序存储一组元素,类型又不受限制,只要是Python支持的类型都可以。他们之间的区别是:

  • 列表属于可变序列,它的元素可以随时被修改或者删除;而元素属于不可变序列,其中的元素不可以被修改,除非整体替换。
  • 列表可以使用append()、extend()、insert()、remove()和pop()等方法实现添加和修改列表元素;而元组则没有这几个方法,因为不能向元组中添加和修改元素,同样,也不能删除元组中的元素。
  • 列表可以使用切片访问和修改列表中的元素:元组也支持切片,但是它至支持通过切片访问元组中的元素,不支持使用切片修改元组中的元素。
  • 元组比列表的访问和处理速度快。所以如果只需要对其中的元素进行访问,而不进行任何修改,建议使用元组而不使用列表。
  • 列表不能作为字典的键,而元组可以
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐