Python 元组

引言

除了两个方面,元组数据类型几乎与列表数据类型一样。

用圆括号()表示

首先,元组输入时用圆括号(),而不是用方括号[]

1
2
tp = ('Python', 'Java', 'C')
print(tp)

不可变

元组与列表的主要区别还在于,元组像字符串一样,是不可变的。元组不能让它们的值被修改、添加或删除:

1
2
tp = ('Python', 'Java', 'C')
tp[1] = 'C++'

如果元组中只有一个值,你可以在括号内该值的后面跟上一个逗号,表明这种情况。否则,Python 将认为,你只是在一个普通括号内输入了一个值。逗号告诉 Python,这是一个元组(不像其他编程语言,Python 接受列表或元组中最后表项后面跟的逗号)。

1
2
3
4
a = ('Python')
print(type(a))
b = ('Python',)
print(type(b))

利用你可以用元组告诉所有读代码的人,你不打算改变这个序列的值。如果需要一个永远不会改变的值的序列,就使用元组。使用元组而不是列表的第二个好处在于,因为它们是不可变的,它们的内容不会变化,Python 可以实现一些优化,让使用元组的代码比使用列表的代码更快。


创建元组

在 Python 中,创建列表通常用 tuple 函数或圆括号 ()。

tuple 函数

list()函数类似,tuple()可以将参数中的可迭代对象转换成元组:

1
2
3
4
a = tuple('Python')
print(a)
b = tuple(['Python', 'Java', 'C'])
print(b)

圆括号

使用圆括号()创建列表时,需要在列表中列出所有元素:

1
2
a = ('Python', 'Java', 'C')
print(a)

直接使用圆括号()将得到一个空的元组:

1
2
a = ()
print(a)

多重赋值

在 Python 中, 允许一次给多个变量赋值, 称为多重赋值。 可以使用元组和列表实现多重赋值:

1
2
a, b, c = ('Python', 'Java', 'C')
print(a, b, c, sep='\n')

元组特性

在列表操作中, 除了对列表进行原地修改的方法, 其他方法都可以应用在元组中, 例如索引、分片、连接和重复等,与列表不同的是,在元组中使用这些方法,会返回新的元组,而不是列表。

单个元素的元组

如果仅仅使用圆括号把一个值括起来, Python 会认为是表达式, 得到的不会是元组类型,而是值本身的类型:

1
2
a = (3.14)
print(type(a))

所以,如果确实希望得到一个包含单个元素的元组,需要在这一单个元素后面加上一个逗号,与表达式区分开来:

1
2
a = (3.14,)
print(type(a))

可以省略的圆括号

在不引起歧义的情况下,可以省略圆括号:

1
2
a = 'Python', 'Java', 'C'
print(type(a))

不可变性

不可变性也是元组和列表最大的区别。 如果试图修改元组的某个元素, 将会触发 TypeError 的异常:

1
2
a = ('Python', 'Java', 'C')
a[1] = 'C#'

元组的不可变性仅指的是不可以改变元组的顶层元素。如果元组中的元素本身是可变的,Python 允许修改其内容:

1
2
3
a = ('Python', ['Java', 'C'], 'Golang', 'C++')
a[1][1] = 'C#'
print(a)

为什么需要元组

主要原因如下:

  • 元组占用的空间较小
  • 你不会意外修改元组的值
  • 可以将元组用作字典的键
  • 函数的参数是以元组形式传递的