Skip to content

Python 的元组与列表类似,不同之处在于元组的元素不能修改。

元组使用小括号 ( ),列表使用方括号 [ ]。

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

实例(Python 3.0+) ​

python
>>> tup1 = ('Google', 'Runoob', 1997, 2000)
>>> tup2 = (1, 2, 3, 4, 5)
>>> tup3 = "a", "b", "c", "d"  # 不需要括号也可以
>>> type(tup3)
<class 'tuple'>

创建空元组

python
tup1 = ()

元组中只包含一个元素时,需要在元素后面添加逗号, ,否则括号会被当作运算符使用:

实例(Python 3.0+) ​

python
>>> tup1 = (50)
>>> type(tup1)  # 不加逗号,类型为整型
<class 'int'>

>>> tup1 = (50,)
>>> type(tup1)  # 加上逗号,类型为元组
<class 'tuple'>

元组与字符串类似,下标索引从 0 开始,可以进行截取,组合等。


访问元组 ​

元组可以使用下标索引来访问元组中的值,如下实例:

实例(Python 3.0+) ​

python
tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7)

print("tup1[0]: ", tup1[0])
print("tup2[1:5]: ", tup2[1:5])

以上实例输出结果:

tup1[0]:  Google
tup2[1:5]:  (2, 3, 4, 5)

修改元组 ​

元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,如下实例:

实例(Python 3.0+) ​

python
tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
tup3 = tup1 + tup2
print(tup3)

以上实例输出结果:

(12, 34.56, 'abc', 'xyz')

删除元组 ​

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,如下实例:

实例(Python 3.0+) ​

python
tup = ('Google', 'Runoob', 1997, 2000)
print(tup)
del tup
print("删除后的元组 tup: ")
print(tup)

以上实例元组被删除后,输出变量会有异常信息,输出如下所示:

删除后的元组 tup : 
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    print (tup)
NameError: name 'tup' is not defined

元组运算符 ​

与字符串一样,元组之间可以使用 +、+=和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

Python 表达式结果描述
len((1, 2, 3))3计算元素个数
>>> a = (1, 2, 3) >>> b = (4, 5, 6) >>> c = a+b >>> c (1, 2, 3, 4, 5, 6)(1, 2, 3, 4, 5, 6)连接,c 就是一个新的元组,它包含了 a 和 b 中的所有元素。
>>> a = (1, 2, 3) >>> b = (4, 5, 6) >>> a += b >>> a (1, 2, 3, 4, 5, 6)(1, 2, 3, 4, 5, 6)连接,a 就变成了一个新的元组,它包含了 a 和 b 中的所有元素。
('Hi!',) * 4('Hi!', 'Hi!', 'Hi!', 'Hi!')复制
3 in (1, 2, 3)True元素是否存在
for x in (1, 2, 3): print (x, end=" ")1 2 3迭代

元组索引,截取 ​

因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,如下所示:

元组:

tup = ('Google', 'Runoob', 'Taobao', 'Wiki', 'Weibo','Weixin')

Python 表达式结果描述
tup[1]'Runoob'读取第二个元素
tup[-2]'Weibo'反向读取,读取倒数第二个元素
tup[1:]('Runoob', 'Taobao', 'Wiki', 'Weibo', 'Weixin')截取元素,从第二个开始后的所有元素。
tup[1:4]('Runoob', 'Taobao', 'Wiki')截取元素,从第二个开始到第四个元素(索引为 3)。

运行实例如下:

实例 ​

python
>>> tup = ('Google', 'Runoob', 'Taobao', 'Wiki', 'Weibo', 'Weixin')
>>> tup[1]
'Runoob'
>>> tup[-2]
'Weibo'
>>> tup[1:]
('Runoob', 'Taobao', 'Wiki', 'Weibo', 'Weixin')
>>> tup[1:4]
('Runoob', 'Taobao', 'Wiki')
>>>

元组内置函数 ​

Python元组包含了以下内置函数

序号方法及描述实例
1len(tuple) 计算元组元素个数。>>> tuple1 = ('Google', 'Runoob', 'Taobao') >>> len(tuple1) 3 >>>
2max(tuple) 返回元组中元素最大值。>>> tuple2 = ('5', '4', '8') >>> max(tuple2) '8' >>>
3min(tuple) 返回元组中元素最小值。>>> tuple2 = ('5', '4', '8') >>> min(tuple2) '4' >>>
4tuple(iterable) 将可迭代系列转换为元组。>>> list1= ['Google', 'Taobao', 'Runoob', 'Baidu'] >>> tuple1=tuple(list1) >>> tuple1 ('Google', 'Taobao', 'Runoob', 'Baidu')

关于元组是不可变的 ​

所谓元组的不可变指的是元组所指向的内存中的内容不可变。

python
>>> tup = ('r', 'u', 'n', 'o', 'o', 'b')
>>> tup[0] = 'g'  # 不支持修改元素
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> id(tup)  # 查看内存地址
4440687904
>>> tup = (1, 2, 3)
>>> id(tup)
4441088800  # 内存地址不一样了

从以上实例可以看出,重新赋值的元组 tup,绑定到新的对象了,不是修改了原来的对象。


相关 ​

练习题 ​

一、知识回顾(读完直接做下面的实践题) ​

  1. 创建元组:用小括号把逗号分隔的值括起来(tup1 = ('Google', 'Runoob', 1997, 2000));括号可以省略(tup3 = "a", "b", "c" 也是元组);空元组写 ()
  2. 只有一个元素的元组必须带逗号:(50,) 才是元组,(50) 会被当成整数 50
  3. 元组的元素不能修改、不能删除——t[0] = 'g' 会报 TypeError: 'tuple' object does not support item assignment;del 只能把整个元组删掉
  4. "元组不可变"指的是元组所指向的内存内容不可变;给变量重新赋值是让它绑定到了新对象(用 id() 看得出地址变了)
  5. 访问元素:下标从 0 开始,也可以从尾部数(tup[-2] 是倒数第二个);切片 tup[1:4] 含头不含尾
  6. 运算符:+ 连接两个元组(生成新元组)、+= 同样能拼接、* 复制重复、in 判断元素在不在、len() 数元素个数
  7. 遍历:for x in 元组: 逐个取出元素;想让输出挤在同一行,就把输出函数结尾的换行换成空格
  8. 内置函数:len(tuple) 元素个数、max(tuple) 最大值、min(tuple) 最小值、tuple(可迭代对象) 转成元组
  9. 与列表互转:list(元组) 转成列表(转完就能改了)、tuple(列表) 转成元组(转完就不能改了)
  10. 怎么选:元组适合存"固定不变的一小串记录"(防止误改、更安全),列表适合要频繁增删改的有序数据

二、裸写题 ​

    • 创建元组 t1 = (1, 2, 3, 4, 5)
    • 创建元组 t2 = ("a", "b", "c")
    • 创建只有一个元素的元组 t3 = (10,)(注意逗号)
    • 打印每个元组及其类型

    批改(2026-09-28):⚠️ 三个元组都创建正确(含 t3 = (10,) 的单元素写法),但只打印了类型(输出三遍 <class 'tuple'>),漏了元组本身的值;参考写法是 print(f"t1: {t1}, 类型: {type(t1)}") 这样三行分别打印。

    - 提示(先自己想,实在想不出再点开)

    一级 · 思路:三个元组按题面写好(单元素那个别丢掉逗号),再一行一个地打印"元组本身 + 它的类型" 二级 · 方法:元组字面量 (元素1, 元素2, ...),只有一个元素时要写成 (元素,);类型用 type() 查 三级 · 骨架:print(f"t1: {t1}, 类型: {____(t1)}") / t3 = (10,____)

    - 参考答案(做完再点开)

    python
    # 2-1
    t1 = (1, 2, 3, 4, 5)
    t2 = ("a", "b", "c")
    t3 = (10,)
    
    print(f"t1: {t1}, 类型: {type(t1)}")
    print(f"t2: {t2}, 类型: {type(t2)}")
    print(f"t3: {t3}, 类型: {type(t3)}")
    • 创建元组 t = ("苹果", "香蕉", "橘子", "葡萄", "西瓜")
    • 打印第一个元素、最后一个元素
    • 打印索引 1 到 3 的切片

    批改(2026-09-28):✅ 正确(t[0] 得 苹果、t[-1] 得 西瓜,切片 t[1:3] 得 ('香蕉', '橘子'))。

    - 提示(先自己想,实在想不出再点开)

    一级 · 思路:和列表一样按下标取元素、按区间切一段,只是括号换成了小括号;最后一个元素从尾部数 二级 · 方法:t[0] 第一个、t[-1] 最后一个、t[开始:结束] 切片(含头不含尾) 三级 · 骨架:print(f"第一个: {t[____]}") / print(f"切片 [1:3]: {t[1:____]}")

    - 参考答案(做完再点开)

    python
    # 2-2
    t = ("苹果", "香蕉", "橘子", "葡萄", "西瓜")
    
    print(f"第一个: {t[0]}")      # 苹果
    print(f"最后一个: {t[-1]}")   # 西瓜
    print(f"切片 [1:3]: {t[1:3]}")  # ('香蕉', '橘子')
    • 创建元组 a = (1, 2, 3) 和 b = (4, 5, 6)
    • 用 + 拼接两个元组
    • 用 * 重复元组 3 次

    批改(2026-09-28):✅ 正确(拼接 (1, 2, 3, 4, 5, 6)、重复三次 (1, 2, 3, 1, 2, 3, 1, 2, 3),+ 和 * 都用对了)。

    - 提示(先自己想,实在想不出再点开)

    一级 · 思路:元组之间的拼接和重复跟字符串一样用加号和乘号;运算后拿到的是一个新元组,原来的没被改动 二级 · 方法:c = a + b 拼接、d = a * 3 重复 三级 · 骨架:c = a ____ b / d = a ____ 3

    - 参考答案(做完再点开)

    python
    # 2-3
    a = (1, 2, 3)
    b = (4, 5, 6)
    
    c = a + b
    print(f"拼接: {c}")  # (1, 2, 3, 4, 5, 6)
    
    d = a * 3
    print(f"重复: {d}")  # (1, 2, 3, 1, 2, 3, 1, 2, 3)
    • 创建元组 t = (3, 1, 4, 1, 5, 9, 2, 6)
    • 用 len() 计算长度
    • 用 max() 获取最大值
    • 用 min() 获取最小值

    批改(2026-09-28):✅ 正确(长度 8、最大值 9、最小值 1 都对)。

    - 提示(先自己想,实在想不出再点开)

    一级 · 思路:数个数、取最大、取最小都是内置函数,直接套在元组上 二级 · 方法:len(t) 长度、max(t) 最大值、min(t) 最小值 三级 · 骨架:print(f"长度: {____(t)}") / print(f"最大值: {____(t)}") / print(f"最小值: {____(t)}")

    - 参考答案(做完再点开)

    python
    # 2-4
    t = (3, 1, 4, 1, 5, 9, 2, 6)
    
    print(f"长度: {len(t)}")    # 8
    print(f"最大值: {max(t)}")  # 9
    print(f"最小值: {min(t)}")  # 1
    • 创建列表 lst = [1, 2, 3, 4, 5]
    • 用 tuple() 将列表转换为元组
    • 创建元组 t = (6, 7, 8)
    • 用 list() 将元组转换为列表

    批改(2026-09-28):✅ 正确(列表转元组 (1, 2, 3, 4, 5)、元组转列表 [6, 7, 8] 都对;转换结果直接赋回 lst、t 两个变量,不影响结果)。

    - 提示(先自己想,实在想不出再点开)

    一级 · 思路:转换用与目标类型同名的内置函数,把要转的对象当参数传进去就行 二级 · 方法:tuple(lst) 列表转元组、list(t) 元组转列表 三级 · 骨架:t = ____(lst) / lst2 = ____(t2)

    - 参考答案(做完再点开)

    python
    # 2-5
    lst = [1, 2, 3, 4, 5]
    t = tuple(lst)
    print(f"列表转元组: {t}")  # (1, 2, 3, 4, 5)
    
    t2 = (6, 7, 8)
    lst2 = list(t2)
    print(f"元组转列表: {lst2}")  # [6, 7, 8]
    • 创建元组 t = (10, 20, 30, 40, 50)
    • 用 for 循环遍历打印每个元素
    • 用 in 判断 30 是否在元组中
    • 用 del 删除整个元组,观察结果

    批改(2026-09-28):✅ 正确(for 循环逐个打印 10~50、30 in t 输出 True、del t 已执行);你是一行一个数字,参考答案用 print(x, end=" ") 挤在同一行,题面只要求"遍历打印每个元素"。

    - 提示(先自己想,实在想不出再点开)

    一级 · 思路:遍历就是用循环把元素一个个取出来打印;判断在不在用成员运算符;元组里的元素删不掉,但可以整个把元组删掉(删完再访问就会报错) 二级 · 方法:for x in t: 逐个遍历;30 in t 判断在不在;del t 删除整个元组 三级 · 骨架:for x in ____: / print(f"30是否在元组中: {30 ____ t}") / ____ t

    - 参考答案(做完再点开)

    python
    # 2-6
    t = (10, 20, 30, 40, 50)
    
    # for 循环遍历
    for x in t:
        print(x, end=" ")  # 10 20 30 40 50
    print()
    
    # in 判断
    print(f"30是否在元组中: {30 in t}")  # True
    
    # del 删除
    del t
    # print(t)  # 报错:NameError: name 't' is not defined
    • 创建元组 t = (1, 2, 3)
    • 尝试修改 t[0] = 10,观察报错信息
    • 用 id() 查看修改前后元组的内存地址

    批改(2026-09-28):⚠️ t = (1, 2, 3) 和两次 id() 都对(实测地址 2630688678976 → 2630688670400,重新赋值后确实是新对象),但修改那行 # t[0]=10 是注释掉的,没有实际跑过、也没记下报错信息;把注释去掉会得到 TypeError: 'tuple' object does not support item assignment。

    - 提示(先自己想,实在想不出再点开)

    一级 · 思路:元组的元素不能改,那一行真的跑起来会直接报错,把报错信息记下来;想制造"改动后"的样子只能整个重新赋值,再用内存地址验证它已经是另一个对象 二级 · 方法:t[0] = 10 会抛 TypeError: 'tuple' object does not support item assignment;看内存地址用 id(t)三级 · 骨架:# t[0] = 10(去掉注释运行看报错)/ print(f"修改前地址: {____(t)}") / t = (10, 2, 3)(整个重新赋值)

    - 参考答案(做完再点开)

    python
    # 2-7
    t = (1, 2, 3)
    print(f"修改前: {t}")
    print(f"修改前地址: {id(t)}")
    
    # 尝试修改会报错:TypeError: 'tuple' object does not support item assignment
    # t[0] = 10
    
    t = (10, 2, 3)  # 重新赋值
    print(f"重新赋值后: {t}")
    print(f"重新赋值后地址: {id(t)}")  # 地址不同,是新对象