什么是元组?

  • Python中的数据结构之一
  • 元组是不可变序列(不可以增删改操作)
  • 元组里面的数据和列表一样有正序索引和倒序索引

元组的创建方式

  • ()小括号创建
  • 用内置函数tuple()创建

()小括号创建

a = ('python', 'holler', 98)
print(a)
print(type(a))

运行结果:

  • ('python', 'holler', 98)
  • <class 'tuple'>

从外观来看,元组和列表只是括号类型不同,就连创建方式都差不多,元组使用()小括号,括号里面的数据使用分隔符,逗号分隔,数据类型为tuple

用内置函数tuple()创建

a = tuple(('python', 'holler', 98))
print(a)
print(type(a))

运行结果:

  • ('python', 'holler', 98)
  • <class 'tuple'>

用内置函数tuple()包裹整个元组结构,相比上面的方式稍微繁琐一些,只是显得比较明了(自己的理解)

还有一种创建方式更方便

a = 'python', 'holler', 98
print(a)
print(type(a))

运行结果:

  • ('python', 'holler', 98)
  • <class 'tuple'>

直接不写()小括号,数据用分隔符,逗号分隔,也算作元组类型

当元组内只有一个数据的时候

a = ('python')
print(a)
print(type(a))
a = ('python', )
print(a)
print(type(a))

运行结果:

  • python
  • <class 'str'>
  • ('python',)
  • <class 'tuple'>

看运行结果,当只有一个数据的时候,如果不加分隔符,逗号在数据后面,哪怕写了()小括号,它也不属于元组,加了分隔符,逗号在数据后面,才是真的元组(同样适用于不写()小括号的情况)

创建空元组

a = ()
b = tuple()
print(a, type(a))
print(b, type(b))

运行结果:

  • () <class 'tuple'>
  • () <class 'tuple'>

()小括号内没有数据就是空元组

为什么元组被设定为不可变序列?

元组相当于一个不可以增删改操作的列表,可以用正序索引或者倒序索引获取里面的数据,当有多个任务调用数据时,数据容易受到篡改导致出错,用不可变序列可以使得数据不被修改,程序中尽量使用不可变序列(可变序列在多任务环境中需要采用加锁的形式轮流使用,来防止数据被修改,就是一个任务在使用这个可变序列里面的数据的时候,锁上,其它的任务暂时不能使用,等前一个任务使用完毕后,按照任务的优先级开放给下一个任务使用)

元组中,每个数据都有自己的标识ID,在不改变标识ID的情况下,里面的数据可以被修改,如果数据本身就是不可变序列,那么无论怎么修改,标识ID都会变动,所以无法修改,如果数据本身是可变序列,例如列表等,可以用不变动标识ID的方法修改里面的数据

a = (10, [20, 30], 40)  # 声明一个元组
print(a)  # 输出原元组
# 分别单独输出元组中三个元素和它们的标识ID
print(a[0], id(a[0]))
print(a[1], id(a[1]))
print(a[2], id(a[2]))
# 尝试直接修改元组中的元素
print(100, id(100))  # 输出整数100和它的标识ID
# 尝试把元组中第一个元素和第二个元素修改成整数100
# 第一个是整数为不可变序列,第二个是列表为可变序列
a[0] = 100  # TypeError: 'tuple' object does not support item assignment
a[1] = 100  # TypeError: 'tuple' object does not support item assignment
# 尝试给元组中第二个元素列表添加数据
a[1].append(100)
print(a)  # 再次输出元组,发现第二个元素列表里面添加了正数100
print(a[1], id(a[1]))  # 单独输出第二个元素和它的标识ID看看有没有改变

运行结果:

  • (10, [20, 30], 40)
  • 10 8791495940048
  • [20, 30] 7401984
  • 40 8791495941008
  • 100 8791495942928
  • TypeError: 'tuple' object does not support item assignment错误提示
  • TypeError: 'tuple' object does not support item assignment错误提示
  • (10, [20, 30, 100], 40)
  • [20, 30, 100] 7401984

第一个元素是整数10为不可变序列,第二个元素是列表[20, 30]为可变序列,第三个元素是整数40为不可变序列,整数100的标识ID和元组中三个元素的标识ID都不相同,元组中,数据无论是可变序列还是不可变序列,都不能改变其引用,也就是不能改变标识ID,所以尝试把第一个元素整数10和第二个元素列表[20, 30]修改成整数100的时候都失败了,报错了,不可变序列没有办法在不改变标识ID的情况下修改其内容,所以在元组中,不可变序列类型的元素是无法修改的,但可变序列类型的元素可以,元组变量名后面加上[]方括号,括号里面填写序号1,代表调用第二个元素列表[20, 30],然后加上.append()(列表的增删改不止这一种方法,具体看列表的笔记),括号内填写要添加进列表的整数100,这样就在第二个元素列表[20, 30]中添加了整数100,变成了[20, 30, 100],然后我们单独输出元组中第二个元素列表[20, 30, 100]和它的标识ID,发现[20, 30, 100]的标识ID[20, 30]的标识ID相同,所以才能修改成功

元组的取值和遍历

a = ('python', 'holler', 98)
print(a[1])
print(a[-3])
for b in a:
    print(b)

运行结果:

  • holler
  • python
  • python
  • holler
  • 98

可以像列表一样用索引取值,正序索引倒序索引都可以,可以使用for...in...循环进行元素遍历

最后修改:2021 年 10 月 27 日 09 : 53 PM