tuple 是不可變 (Immutable) 的資料型態。
元組(tuple) 是 Python 的資料儲存容器之一,最大的特點就是,它是「不可變」(Immutable)的資料型態。(本文以直接以 tuple 稱呼元組。)
其他型態的容器包括:串列(list)、字典(dictionary)、集合(set),但這些都是「可變」 (mutable)的資料型態。
「可變」與「不可變」是很重要的觀念,關乎你如何操作各種資料型態,看到資料型態就要可以判斷它可不可變。
雖說如此,但卻不是要你刻意的去硬背它,死背只會讓你離程式語言越來越遠,因為你不了解,卻要背一堆東西,無聊感會與日俱增。
透由了解各種資料型態的操作,你就會記得了;尤其當你胡亂地用了一堆不合適的方法(Method)後,你會對「可變」與「不可變」有更深的體認,也會讓你記得誰可變,誰不可變。
這也是為什麼,學程式語言要實際打打程式碼,光上課、看影片或書籍是無法進步的,試著編寫程式,甚至照著範例打(相信我,你有很高機率照著打還是會打錯),都會有幫助。
回到正題,tuple 這個讓人沒有頭緒的資料型態,在 Python 中究竟扮演什麼角色呢?
初次看到 tuple ,腦中產生的疑惑是 tuple 怎麼唸啊?
另一個疑惑是,tuple 用小括號表示,串列(list)用中括號表示,都用逗號區隔項目,但這兩個資料型態也長得太像了吧!
關於這兩個疑惑,讓我們接著看下去,逐一為你解答。
首先,先說明一下 tuple 以小括號()來表示,不同項目之間以逗號隔開,屬於序列結構。
序列結構是什麼?
序列,指的是 tuple 內的值有順序性;結構,指的是資料結構(data structure),是電腦中儲存、組織資料的方式。
tuple 怎麼發音
關於這麼問題,Python的創造者 Guido van Rossum,2011年在 tweet 鄭重的說明 tuple 怎麼發音:
Guido van Rossum 怎麼說的呢?
他說,他是這樣念 tuple的:
- 周一、三、五這三天,唸 too-pull。下方影片有發音可以聽。
- 周二、四、六這三天,唸 tub-pull。下方影片有發音可以聽。
- 星期日他不會談到 tuple,所以周日沒有 tuple 怎麼唸的問題。
這是什麼意思呢?
就是你要唸 too-pull 或 tub-pull 都可以,都有人唸,只要你別唸成 apple 就好。
tuple與串列(list)差在哪?
tuple 與串列這兩個很相像的資料型態,長那麼像,差別在哪?
tuple 與串列主要有三點不同:
- 使用的符號不同
tuple ,用小括號表示 。
例如 (‘a’, ‘b’)。
串列,用中括號表示 。
例如 [‘a’, ‘b’]。 - tuple屬於不可變的資料型態
不可變(Immutable)是什麼意思?
就是你不可以修改、增減tuple的值。
也因為 tuple 不可變的特性,所以沒有append()、remove()、pop()等會更動值的操作。 - 只含有一個項目時,要加上逗點
當你要建立只有一個項目的 tuple,千萬要記得加上逗號,否則不會建立 tuple。
怎麼建立 tuple?
在項目後方加上逗號
在每個要放入 tuple 這個容器的項目後方加上一個逗號。
例如,想在名為建立一個取名為 number 的 tuple,裡面包含三個項目,分別是數值 1、2、3。
>>>number = 1, 2, 3
>>>print(number)
(1, 2, 3)
想建立只有 1 個項目的 tuple 時,千萬要記得加上逗號,否則不會建立 tuple。
這點與串列(list)不同,你在建立串列時,既便只有一個項目,不需要加上逗號也可以製作串列。
>>>number = 1,
>>>print(number)
(1,)
使用小括號建立
在不使用函式的情況下,通常我們在建立 tuple 時,會加上小括號以利辨別,閱讀程式碼時就可以快速看出資料型態是 tuple。
這也是比較常見的方式。
>>>number = (1, 2, 3)
>>>print(number)
(1, 2, 3)
同樣的,如果項目只有一個時,要記得加上逗號!
不加逗號是什麼情況呢?
我們來看看下面的例子。
例如,今天你的人生成就終於達到 A+,你想建立一個名為 score 的 tuple 紀念一下,這個 tuple 就只含有 A+ 這個項目。
所以你在小括號中放入A+ 這個值,印出 score,期待得到 tuple,但你只得到一樣的資料,就是 A+ 這個字串。
使用type() 函式驗證,果然是 str(字串,string)。
>>>score = ('A+')
>>>print(score)
A+
>>>print(type(score))
<class 'str'>
而如果你在 ‘A+’ 後方加上一個逗號,就可以成功建立 tuple 了。
>>>score = ('A+',)
>>>print(score)
('A+',)
>>>print(type(score))
<class 'tuple'>
只是差了一個逗號,結果大不同,而這種小細節就是寫程式容易會產生 bug 的地方,其實你都會,但就是不小心錯了一點點,便會讓你覺得很崩潰。
空 tuple 可以直接用空的小括號建立,這個時候就不用再加逗號囉。
>>>score = ()
>>>print(score)
()
>>>print(type(score))
<class 'tuple'>
用 tuple() 函式建立
tuple() 函式可以讓你把其他的資料型態轉換為 tuple
下方的例子,就把 score 字串(string)及 number 串列(list)轉變為 tuple。
>>>score ='A+'
>>>print(tuple(score))
('A', '+')
>>>number = [1, 2, 3]
>>>print(tuple(number))
(1, 2, 3)
什麼時候會使用 tuple?
當你的值都不會改變,而且你也不希望值被更動的時候,就是適合使用 tuple的時候。
tuple 有以下幾個優點:
- 因為不可變(immutable)的特性,運作起來比串列還要快。
- 不會不小心改變 tuple 的值,也就是 tuple 的項目不會不小心被更動到。
- 占用的空間比較少。
- 作為字典(dictionary)的鍵(key)使用,因為字典的鍵需要不可變的值。
- 具名 tuple 可以簡易的作為物件的替代品。
在一般的 Python 程式設計中,tuple 不會很常使用到。
同屬資料儲存容器類型的串列(list)、字典(dictionary)才是比較常使用的資料型態。
tuple的操作上,包括使用len()函式來得到項目數量、以位置(index)來找尋值、slice、+ 運算子、* 運算子,或是 for 與 in 的迴圈等。
只要不牽扯到變更值的事情,都與串列很相似,但只要會更動到值,tuple 就完全不能做。
台大盧信銘教授在 coursera 的課程便將 tuple 說明得相當清楚,不到 10 分鐘的教學影片,幫你快速弄懂 tuple。
延伸閱讀:
谢谢
不客氣