2.8. 元组¶
元组(tuple)是不可变的、有序的值序列。一旦创建,其中的元素就不能再添加、删除或更改。
2.8.1. 创建元组¶
使用圆括号(或仅用逗号)来创建元组:
empty = ()
point = (3, 4)
triple = 1, 2, 3 # parentheses are optional
mixed = (1, "two", 3.14)
nested = ((1, 2), (3, 4))
2.8.1.1. 单元素陷阱¶
围绕一个值的圆括号只是普通的括号;真正构成元组的是逗号。单元素元组需要一个尾随逗号:
>>> (1)
1 # just an int in parens
>>> (1,)
(1,) # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)
2.8.2. 长度、索引和切片¶
与列表和字符串相同—— len()、索引、切片、in 以及 + / * 的工作方式都一样:
>>> point = (3, 4, 5)
>>> len(point)
3
>>> point[0]
3
>>> point[1:]
(4, 5)
>>> 4 in point
True
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)
2.8.3. 不可变性¶
元组没有 append、pop、sort 或任何其他就地方法。索引赋值会引发 TypeError:
>>> point = (3, 4)
>>> point[0] = 99
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item assignment
要"修改"一个元组,需用更改后的值构建一个新元组。
2.8.4. 解包¶
元组的主要绝招是解包:在一条语句中把每个元素赋给一个单独的变量。
解包在一次赋值中把元组的每个元素绑定到一个命名变量。¶
>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4
右侧可以是任意可迭代对象——列表、字符串、函数的返回值:
>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')
前导的 * 会把解包中"剩下的部分"收集到一个列表里:
>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]
2.8.5. 多个返回值¶
函数可以返回一个元组以便一次性传递多个值;调用方在接收时将它们解包:
def size_of(rect):
return (rect[2] - rect[0], rect[3] - rect[1])
width, height = size_of((10, 20, 110, 140))
# width = 100, height = 120
return 上的圆括号是可选的——裸写的 return a, b 同样是一个元组。
2.8.6. 元组与列表对比¶
关于该选用哪一种的实用指南:
对于固定形状、通常异构的数据用元组:
(x, y)点、(r, g, b)颜色、多个返回值、打包以备后用的函数参数。对于变长、通常同构的数据用列表:一组测量值、待处理项的队列、任何你预期会向其追加内容的东西。
元组也是可哈希的(只要其中每个元素都可哈希),因此它们可以用作 dict 中的键。