5.3. 元组和序列

我们看到列表和字符串有很多共同特性,例如索引和切片操作。他们是 序列 数据类型(参见 序列类型 —- list, tuple, range)中的两种。随着 Python 语言的发展,其他的序列类型也会被加入其中。这里介绍另一种标准序列类型: 元组

一个元组由几个被逗号隔开的值组成,例如

  1. >>> t = 12345, 54321, 'hello!'
  2. >>> t[0]
  3. 12345
  4. >>> t
  5. (12345, 54321, 'hello!')
  6. >>> # Tuples may be nested:
  7. ... u = t, (1, 2, 3, 4, 5)
  8. >>> u
  9. ((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
  10. >>> # Tuples are immutable:
  11. ... t[0] = 88888
  12. Traceback (most recent call last):
  13. File "<stdin>", line 1, in <module>
  14. TypeError: 'tuple' object does not support item assignment
  15. >>> # but they can contain mutable objects:
  16. ... v = ([1, 2, 3], [3, 2, 1])
  17. >>> v
  18. ([1, 2, 3], [3, 2, 1])

如你所见,元组在输出时总是被圆括号包围的,以便正确表示嵌套元组。输入时圆括号可有可无,不过经常会是必须的(如果这个元组是一个更大的表达式的一部分)。给元组中的一个单独的元素赋值是不允许的,当然你可以创建包含可变对象的元组,例如列表。

虽然元组可能看起来与列表很像,但它们通常是在不同的场景被使用,并且有着不同的用途。元组是 immutable (不可变的),其序列通常包含不同种类的元素,并且通过解包(这一节下面会解释)或者索引来访问(如果是 namedtuples 的话甚至还可以通过属性访问)。列表是 mutable (可变的),并且列表中的元素一般是同种类型的,并且通过迭代访问。

一个特殊的问题是构造包含0个或1个元素的元组:为了适应这种情况,语法有一些额外的改变。空元组可以直接被一对空圆括号创建,含有一个元素的元组可以通过在这个元素后添加一个逗号来构建(圆括号里只有一个值的话不够明确)。丑陋,但是有效。例如

  1. >>> empty = ()
  2. >>> singleton = 'hello', # <-- note trailing comma
  3. >>> len(empty)
  4. 0
  5. >>> len(singleton)
  6. 1
  7. >>> singleton
  8. ('hello',)

语句 t = 12345, 54321, 'hello!'元组打包 的一个例子:值 12345, 54321'hello!' 被打包进元组。其逆操作也是允许的

  1. >>> x, y, z = t

这被称为 序列解包 也是很恰当的,因为解包操作的等号右侧可以是任何序列。序列解包要求等号左侧的变量数与右侧序列里所含的元素数相同。注意可变参数其实也只是元组打包和序列解包的组合。