python元组和序列,
我们知道链表和字符串有很多通用的属性,例如索引和切割操作。它们是序列类型(参见 Sequence Types — str, unicode, list, tuple, bytearray, buffer, xrange )中的两种。因为 Python 是一个在不断进化的语言,也可能会加入其它的序列类型,这里介绍另一种标准序列类型:元组。
一个元组由数个逗号分隔的值组成,例如:
>>> t = 12345, 54321, 'hello!' >>> t[0] 12345 >>> t (12345, 54321, 'hello!') >>> # Tuples may be nested: ... u = t, (1, 2, 3, 4, 5) >>> u ((12345, 54321, 'hello!'), (1, 2, 3, 4, 5)) >>> # Tuples are immutable: ... t[0] = 88888 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> # but they can contain mutable objects: ... v = ([1, 2, 3], [3, 2, 1]) >>> v ([1, 2, 3], [3, 2, 1])
如你所见,元组在输出时总是有括号的,以便于正确表达嵌套结构。在输入时可以有或没有括号,不过经常括号都是必须的(如果元组是一个更大的表达式的一部分)。不能给元组的一个独立的元素赋值(尽管你可以通过联接和切割来模拟)。还可以创建包含可变对象的元组,例如链表。
虽然元组看起来类似于列表,它们经常用于不同的场景和不同的目的。元组是 不可变的,通常包含不同种类的元素并通过分拆(参阅本节后面的内容)或索引访问(如果是 namedtuples,甚至可以通过属性)。列表是 可变的,它们的元素通常是相同的类型并通过迭代访问。
一个特殊的问题是构造包含零个或一个元素的元组:为了适应这种情况,语法上有一些额外的改变。一对空的括号可以创建空元组;要创建一个单元素元组可以在值后面跟一个逗号(在括号中放入一个单值不够明确)。丑陋,但是有效。例如:
>>> empty = () >>> singleton = 'hello', # <-- note trailing comma >>> len(empty) 0 >>> len(singleton) 1 >>> singleton ('hello',)
语句 t = 12345, 54321, 'hello!'
是 元组封装 (tuple packing)的一个例子:值 12345
, 54321
和 'hello!'
被封装进元组。其逆操作可能是这样:
>>> x, y, z = t
这个调用等号右边可以是任何线性序列,称之为 序列拆封 非常恰当。序列拆封要求左侧的变量数目与序列的元素个数相同。要注意的是可变参数(multiple assignment)其实只是元组封装和序列拆封的一个结合。