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可變參數其實也只是元組打包和序列解包的組合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章