使用括號包圍的數據結構是元組(tuple)。例如:html
>>> (1,2,3) (1, 2, 3) >>> T = (1,2,3,) >>> T (1, 2, 3)
元組和列表同樣,都是容器型的數據結構,且都是序列,因此容器中的元素都是按照索引位置有序存放的。因此,能夠進行索引取值、切片等序列通用操做。python
不一樣的是,元組是不可變序列,沒法原處修改,意味着修改元組必須建立新的元組對象。實際上元組的概念來源於數學,在關係型數據庫中用來表示一行數據對象,而行數據對象是固定不變的完整、穩定結構,python的元組也同樣隱含的是完整性、穩定性。數據庫
不可變序列一樣意味着可使用hash()內置函數進行hash,也就是說它是hashable的。數據結構
hashable的類型是穩定的數據,能夠放在一些須要穩定結構的地方,好比Set、dict的key,它們內部都是經過hash後的數據存放的。hashable意味着不一樣對象的hash值不一樣。好比類的實例對象全都是不一樣的,之因此不一樣是由於它們默認就是hashable的,不一樣對象的hash值不一樣。函數
元組能夠看做是不可變的列表。它們的結構很是相似,都是在容器中存放元素的引用地址。code
它的結構圖以下:htm
這個結構圖什麼意思,這裏再也不贅述,若有須要,參考我對列表的介紹文章。對象
由於元組是不可變對象,因此修改元組數據會報錯。也就是說,元組中的保存的引用地址是不可變的。blog
>>> T = (1111,2222,3333,4444) >>> T[0] = 11111 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
直接使用括號包圍元素便可,或者使用元組的構造函數tuple()將數據轉換成元組。例如:索引
>>> (1,2,3,4) (1, 2, 3, 4) >>> tuple("abcdef") ('a', 'b', 'c', 'd', 'e', 'f') >>> tuple([1,2,3,4]) (1, 2, 3, 4)
括號中能夠加一個尾隨逗號:
>>> 1 1
須要注意的是,python中不少地方隱式地自動構造元組。它的隱式構造規則是這樣的:若是沒有指定括號,又有多個值,那麼就使用元組做爲容器。
>>> 1,2 (1, 2)
再者,爲了區分沒有括號的元組和單個數據對象,能夠在想要做爲元組元素的數據後面加上逗號。例如:
>>> 1, # 元組 (1,) >>> (1,) # 元組 (1,) >>> 1 # 單個數據 1 >>> (1) # 單個數據 1
元組中能夠嵌套任意類型的數據對象:
>>> (1,2,(3,4)) (1, 2, (3, 4)) >>> (1,2,[3,4]) (1, 2, [3, 4])
元組是不可變的序列。序列意味着它的元素是按索引位置有序的,序列的通用操做元組均可以使用,不可變序列意味着那些序列的修改行爲都不能用,可是卻可使用hash()內置函數對元組進行hash。
關於序列有哪些通用操做,哪些是不可變序列具備的操做,哪些是可變序列具備的操做,詳細內容參見:Python中的序列操做。
這裏簡單介紹一點基本操做。
元組支持+ *
符號操做:
>>> T = (1,2,3,4) >>> T1 = ('a','b','c') >>> T + T1 (1, 2, 3, 4, 'a', 'b', 'c') >>> (1,2) + tuple("34") (1, 2, '3', '4') >>> T * 2 (1, 2, 3, 4, 1, 2, 3, 4) >>> 2 * T (1, 2, 3, 4, 1, 2, 3, 4)
能夠經過+=
的方式進行二元賦值:
>>> T1 = (1,2,3) >>> T2 = (4,5,6) >>> T1 += T2 >>> T1 (1, 2, 3, 4, 5, 6)
元組是序列,序列類型的每一個元素都是按索引位置進行存放的,因此能夠經過索引的方式取得元組中的各個元素,經過切片的方式取得子元組:
>>> T = (1,2,3,4,5) >>> T[0] 1 >>> T[:3] (1, 2, 3) >>> T[:] (1, 2, 3, 4, 5) >>> T[2:-1] (3, 4)
但不能賦值,由於元組是不可變對象。
>>> T = (1,2,3,4) >>> T[0] = 11 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
由於元組是不可變對象,因此可使用hash()進行hash:
>>> hash(T) -1883319094 >>> hash((1,2,3)) -378539185 >>> hash([1,2,3]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'
由於元組是不可變對象,因此沒有直接方法修改元組,只能經過其它手段根據原始元組間接地構造新元組。切片返回的元組也是一種修改方式。
另外,要修改元組,能夠考慮將元組轉換成可變的列表,修改以後再轉換回元組。例如:
>>> t = ('a','b','c','d') >>> tmp = list(t) >>> tmp[2] = "cc" >>> t = tuple(tmp) >>> t ('a', 'b', 'cc', 'd')
或者,經過解析的方式構造新元組,但元組解析必須注意的是元組的括號特殊性,由於它會被看成表達式的包圍括號,而不是元組的構造括號。因此,只能使用tuple()包圍解析表達式。
>>> T = (1,2,3,4,5) >>> tuple( i * 2 for i in T) (2, 4, 6, 8, 10) >>> ( i * 2 for i in T) # 不是元組,而是表達式括號 <generator object <genexpr> at 0x03572150>