python元組類型

元組類型簡介

使用括號包圍的數據結構是元組(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>
相關文章
相關標籤/搜索