所以我們就接下來來看這個一個一個來看,就是 tuples,那
各位可能就是第一次聽到這個名詞叫做 tuples。
那 tuples 它事實上是一個很像是 list 的東西,它很像 list。
但是它跟 list 有一些不一樣的地方,那主要第一個不一樣的地方是說它是所謂的
immutable,之前說這個 list 是 mutable,對不對?你是可以去,你建構一個
list 之後呢你可以把這個 list 加長,或者把其中裡面的某一個這個元素把它
換成其他的值,對不對?它是一個可改變的,mutable。
那但是呢 tuples 它也是一樣是一串東西,但是它是 immutable。
意思是說你建構出來之後呢,你這個結構呢就不可以再 改變什麼,就是你不可以把它加長啊,不可以把裡面其中的某個值
換掉啊,類似不可以做這些事情。
那它跟 list 不一樣的是說,tuples
它在建構的時候呢它是用這個圓括號, 那 list
是用方括號,那用圓括號呢有一個缺點就是說很多別的時候我們也會用到圓括號。
所以就是說,我們如果說你建一個 tuple 裡面只有一個元素的話,你必須要用這個
這個一個圓括號,比如說你要建立一個 tuple,裡面只有一個元素 11,後面必須要接一個逗點, 必須要這個樣子。
這樣 python 才知道你說的是要建 一個元素的 tuple,而不是整個數字 11。
那所以我們看幾個例子,比如說你如果要建一個 tuple 裡面有三個元素是 11, 22,
33 的話,你就是這樣 mytuple=(11,22,33),然後一樣跟
list 一樣你是可以用 這個整數的 index 下去 access 裡面的元素,比如說位置
0 或者你要倒數第一個,對不對?那就是 33, 或者是
0 到 1 的位置就是事實上就是 第一個元素。
那這時候呢比如說你如果是 slice 這個叫 slicing,對不對?大家應該還記得,那
slicing 的話就是說 在這邊就是說從第 0 個開始,然後呢 在第 1
個之前,對不對?所以那它回傳的東西也會是一個 tuple,那你看到它的這個回傳的這個
表示就是是一個圓括號,然後就一個元素後面一個逗點,這個 comma
呢是 必須的,是必須的,我們再次強調。
那 有人說為什麼要有這個奇怪的規定,因為我們如果是在建構一個元素的 list
的時候, 其實不需要做這個事情,對不對?因為一個元素的 list 它是方括號,你就寫 [11]
就好了, 對不對?這個 [11] 跟這個數字 11 就是不一樣的東西嘛。
但是在這個,因為圓括號,因為 tuple 是用圓括號,所以 (11)
事實上就是代表 11 這個數字,對不對?就是想想各位在做這個一些數值的運算的時候你會用到
圓括號嘛,所以圓括號本身就是一個在數值運算上是一個合法的東西,對不對?然後呢所以 你如果只有寫這個
(11) 的話,它就是變成整數 11 了,必須要在 (11) 的這個
11 後面加一個逗點, 這樣它才會被解釋成一個 tuple。
那 這當然是一個很小的事情,但是就是說有時候
就是這種小細節會造成很大的困擾,所以你現在先搞清楚
事後就不會有這些問題。
那 所以這個 tuple 就如同前面所說的,它是所謂的
immutable,就是它是不能改變的, 所以不能改變是什麼意思呢?就是說呢比如說呢
在這邊這個例子是這樣子的,就是說我們先建了一個東西叫做 mytuple,對不對?所以
這個 mytuple 呢我們就用一個這個,用一個這個
東西來表示,現在我們建一個 mytuple 裡面有三個元素是
11,22,33,對不對?然後它在記憶體的某個地方。
你說呢 mytuple
呢 是這個東西,對不對?然後呢我們
說這個 saved=mytuple,所以我們建了一個新的名字叫做
saved,也是這個東西。
對不對?然後呢這時候呢我說 mytuple 要做什麼事情呢?+=
一個新的這個 tuple,裡面只有一個 element 是 44,所以它就會做一個
新的這個 tuple 裡面有四個 element,所以它做什麼事情呢?
它事實上是這樣子,它事實上是做了一個新的這個 allocate
一塊新的記憶體,然後裡面是 11,22, 33 跟 44。
然後呢,這時候 它做了什麼事情呢?它就
把 mytuple 呢不再指到這裡去,mytuple
現在就是指到 這裡,指到這裡,
mytuple 就指到這裡了。
所以呢這時候呢你如果說,你如果問 mytuple 是什麼呢?它就
告訴你說 (11,22,33,44) 如你所願,對不對?你就是串接了一個新的。
那但是呢,這個 saved 的這個部分呢還是一樣是 (11,22,33),因為現在 saved 是指到原來這個地方。
那這個是一個 immutable 的這個變數的中間的這個操作 的方式,這跟 mutable 是不一樣的,如果是
mutable 的串接的話, 那就會是,本來如果說是 11,22,
33 的話,那串接它就直接在下面再串一個 44,但是
這個是 mutable 的做法,所以 list 是這樣做的,list 是這樣做的。
但 list 這個每一個位置不一定就是接連在一起的,但是就是說 它
list 是概念上是這樣子,但是這個 tuple 就不是,那 tuple 就是它就會
allocate 一塊新的記憶體,然後把所有的東西都拷貝過去。
好那這個 是這個一些比較細節的差別,那如果說這個
你不是非常清楚的話,反正就是,你心裡面知道就是說這個 immutable
就是說它是 不可變的,那不可變的意思就是說你如果對它的值有改變的話它事實上是
做出一個新的東西,然後把它的名字叫成原來的名字,大概是這個意思。
那所以這個,接下來我們來看一下一些常見的錯誤,就是說比如說 像前面如果說我們有一個
mytuple 這個東西,你如果說你要把它 += 55
的話,這樣是一個不允許的一個 operation,對不對?因為就是說呢
在 tuple 裡面加是代表串接嘛,加是代表串接,但是你加的東西本身不是一個
tuple, 就是你不能把 tuple 串別的東西,tuple 一定要串 tuple,一定要串
tuple,所以就是說 這個是一個不合法的一個這個運算,我們是必須要知道的。
那這個另外就是說呢 tuple 本身因為是 immutable,所以你不能直接叫
tuple 去 排序內部的元素,不能做這個,list 是可以做這個事情,但是 tuple 是不能做這個事情的。
所以你不能直接 atuple.sort() 這是不行的,但是你可以做的事情是你可以用
sorted 這個函數下去排序 這個它的這個裡面的東西,那排完之後呢,它的性質
事實上是會變的,它就不再是 tuple 了,因為 sorted 的 output 會是一個 list,
所以你對一個 tuple 用 sorted 排序之後,它 output 是一個 list,你看它 output 的是方括號的東西, 那是一個
list,所以它是變得不同,另外一種資料結構,那這個也是大家要特別注意的。
那另外很多東西,其實除了這些,我們前面特別強調的是不同的地方,那除了這些 東西之外呢,其實
tuple 跟 list 它有很多類似的地方,然後那比如說 你可以 len
去看總共有幾個元素,對不對? 或者你可以用 in 這個 operation
去說呢這個 去看看說某個元素有沒有在
你的這個 tuple 裡面,這都是一樣的。
那 這個,當然這個 list 跟 tuple 是可以互相轉換的,有時候依據你的需求你可以把 list 轉
tuple,或 tuple 轉 list,那做的事情就是有點像是就是我們前面做的做型別轉換是一樣的,比如說你現-
在有一個 list, 是 [11,22,33],那比如說用 tuple 這個
這個函數然後呢傳進去 alist,它就會變成一個 tuple,
所以這時候呢一樣也是 11,22,33,但是它變圓括號,就變 tuple。
那這個另外一個比較注意的地方就是說呢如果說你是把一個字串 轉成 tuple
的話呢,它會做的事情是會把這個字串裡面的每一個 character 拆開來,就是一個 character
是一個 element,這樣子的一個 tuple,那這也很合理嘛,因為這個字串本身它就是
一堆這個 character 的這個 sequence,這個我們前面有講,它就是一串
這個 character,所以那轉成 tuple 很自然地它就是會把它拆開成是這個樣子。