天天看點

python元組和序列

我們看到清單和字元串有很多共同特性,例如索引和切片操作。他們是 序列 資料類型(參見 序列類型 --- list, tuple, range)中的兩種。随着 Python

語言的發展,其他的序列類型也會被加入其中。這裡介紹另一種标準序列類型: 元組。

一個元組由幾個被逗号隔開的值組成,例如

>>> 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])           

如你所見,元組在輸出時總是被圓括号包圍的,以便正确表示嵌套元組。輸入時圓括号可有可無,不過經常會是必須的(如果這個元組是一個更大的表達式的一部分)。給元組中的一個單獨的元素指派是不允許的,當然你可以建立包含可變對象的元組,例如清單。

雖然

python元組

可能看起來與清單很像,但它們通常是在不同的場景被使用,并且有着不同的用途。元組是 immutable (不可變的),其序列通常包含不同種類的元素,并且通過解包(這一節下面會解釋)或者索引來通路(如果是 namedtuples 的話甚至還可以通過屬性通路)。清單是 mutable (可變的),并且清單中的元素一般是同種類型的,并且通過疊代通路。

一個特殊的問題是構造包含0個或1個元素的元組:為了适應這種情況,文法有一些額外的改變。空元組可以直接被一對空圓括号建立,含有一個元素的元組可以通過在這個元素後添加一個逗号來建構(圓括号裡隻有一個值的話不夠明确)。醜陋,但是有效。例如

>>> singleton = 'hello',    # <-- note trailing comma
>>> len(empty)
0
>>> len(singleton)
1
>>> singleton
('hello',)           

語句 t = 12345, 54321, 'hello!' 是 元組打包 的一個例子:值 12345, 54321 和 'hello!' 被打包進元組。其逆操作也是允許的

這被稱為 序列解包 也是很恰當的,因為解包操作的等号右側可以是任何序列。序列解包要求等号左側的變量數與右側序列裡所含的元素數相同。注意

python可變參數

其實也隻是元組打包和序列解包的組合。