那麼最後呢,我們來講一點這個 list operations 的介紹, 介紹什麼啊?其實仔細一想就會發現,其實是介紹不完的, 因為我們剛剛比如說介紹過 append,這個東西 那 append 呢是把一個 element 加到 list 的最後面, 但事實上我們還有非常多其他的事情可以做。 比如說,如果 我不想要加在最後面怎麼辦?如果我想要加在中間,不行嗎?可以, 你可以改用 insert 這個函數。 如果我想要 把某一個東西刪掉呢?用 remove 這個函數, 如果我今天想要算算看我某一個東西出現在 list 裡面幾次, 你可以用 count,那我們可以傳 index 去找 item, 我能不能傳 item 去回傳 index 呢?可以,用 index 這個函數, 你甚至可以把 list 頭到尾,尾到頭反過來,或者是幫這個數值資料 排序等等。 那麼,這許多東西, 如果我們全都要寫一個相關的這個 example 給你看的話,實在太麻煩了,所以我們不如就用一個 example 就好了。 所以比如說,如果我的 lst 這個 list 本來是 [3,1,4,1,5,9],那我們 append(2) 它就會跑出 2 來,我們 sort 它,它就會由小到大,我們 reverse 它,它就會 由大到小,然後呢,如果你說,請告訴我 4 的 index 是多少,它會告訴你是 2, 如果你說你要在 4 這個位置 insert Hi 這個東西,那麼 它就會 0,1,2,3,它就會在 4 這個地方 insert Hi 這個東西, 後面的東西呢就往後推。 然後呢,如果你想要問它,請問 1 出現了幾次, 那 1 出現了兩次,我把 1 刪掉吧,它就會把第一次 出現的 1 刪掉,所以還會剩下一個。 然後我說,那我們來 pop(3) 吧, 那麼呢,它就會把 3 這個東西拿出來,拿出來,然後呢你再去檢查的話 3 這個東西不見了,因為剛剛被 pop 掉了。 那我們這裡介紹的還只是一些比較常用的 這個 list 的 operations,那事實上還有一大堆,那你就想說啦,老師啊 我怎麼有辦法記住這麼多東西呢?好消息是你不需要記住, 你不需要記住函數的名稱,你也不需要記住函數要怎麼用, 你能夠記住當然是最好的,記不住的話不要勉強,因為這些都查的到, 完全沒有把它們記下來的必要,那我稍微示範一次給大家看。 今天呢,假設你在寫程式,寫呀寫呀寫的,你就想說,唉 這個 list 我想要把它頭跟尾尾跟頭反過來,我想要 reverse 它怎麼辦?但是你不知道 Python 有沒有這個功能,請千萬不要忙著自己寫,你就 上網 google,比如說你就 google python list 這樣子的東西,你不知道函數名稱,你起碼知道你在做 list 的事情,對吧? 那你就去搜尋它,那麼呢我們就會看到各式各樣的網頁, 那你一開始可能會很困擾,想說哪我該看哪一個網頁呢?呃,你問我的話,我總是看 英文網頁,因為通常資料比較完整,但如果你覺得看中文的比較快,那也 OK,總之你就多看幾個吧, 好,比如說我就看的這一個,這個呢仔細一看, 這不是 Python 的官方網站嘛,那這上面的資訊想來應該不會有太大問題, 那你就看,有 append,有 extend、 insert、 remove、 pop clear、 index 等等,你就把它們花點時間全部看一遍, 你就會發現,reverse 在這裡,然後它似乎有這個作用,然後呢 example 可以看 然後甚至底下還有各式各樣的教學,這就是大家未來的人生啦, 你呢,學程式語言這種東西的時候,老師教你一套你會聽, 聽完了以後你會留下印象,但你真正要變強必須要自己練習, 這個沒有問題,你練習的過程中會發現很多事情你不會做, 這個時候你會去查資料,而程式語言這種東西的網路資料非常豐富 所以你會嘗試去線上找,線上找有時候比你翻字典啊翻書都還要快得多。 你呢如果是忘記 append 怎麼用,你可以來 google python list append,比如說 那麼你就會得到 append 的相關介紹,很多很多的 介紹,如果你連 append 是什麼都忘了,你就 python list, 諸如此類的,那以後呢你會有各式各樣的機會需要自行查詢你要查的東西。 給大家一個建議,就是來慢慢練習使用網路查詢,等到你會 使用網路查詢你需要的東西了以後,差不多可以宣稱自己是一個程式設計的大師了。 好,那我們再回來。 最後呢跟大家講一個 跟 list 有關的概念,那這個概念還蠻深入的,不過你可能得要知道 不然有一天你遇到它的時候呢你就會完全不知道發生了什麼事,那可能會對你的程式帶來一些- 毀滅性的傷害。 這個呢概念會發生在我們在 copy 一個 list 的時候,那我們來看看這是在幹嗎。 這裡有一個 program,這個 program 做的事情是說,先給你一個 aList,裡面有 1,2,3 三個東西 接著呢我們給你 anotherList,然後這個 anotherList 被做出來 的方式是我們用 aList 來 assign 給這個 anotherList, 換句話說呢,就是一個 copy 啦,那我們以前做過類似的 事情,我們以前呢可能會說,好,a 等於 10 這是一個 assignment,然後呢,b=a,那我們就是 create 一個變數 b,然後把 a 的 value 塞給它嘛,所以 b 也會變成 10,它們會是兩個變數。 所以現在呢你應該也是得到兩個 list,那麼緊接著你就說,好, 那我們把 anotherList 裡面的第一個 element 改掉,變成 5,然後你去 print aList, 出乎意料地,aList 竟然變了,那我們看一下, 好, 一執行下去呢,你發現,唉 5,2,3,確實是 5,2,3,可是不對呀, 被修改的明明是 anotherList,為什麼 aList 里的內容會跟著改? 而且還真的是變成 5,難道是巧合嗎?難道是意外嗎?難道是 python 有 bug 嗎?都不是,是 python 的設計,今天呢我們 aList 為什麼會被 modify?是因為在 python 裡面 list variable 事實上是一個所謂的 reference, 那你可以翻成參照,anyway,它呢只是從某個地方去參照到 一系列的變數,一系列的值,如此而已,換句話說呢, 你可以把它想成這個 set of value 是這個 1,2,3,可以想成是某個地方 種了一塊田,或者是種了三塊田,裡面分別種了玉米、 香菇、 芒果,whatever,就種了東西,好, 然後呢這個 list variable aList 事實上就只是 像是一個地址而已,在跟你說東西在這兒,你去看, 所以當你有 anotherList 的時候呢,它其實也是一個 reference,只是 copy 這個 reference,而不是 copy 這些值, 所以當我們今天用一個 reference 去把值改掉的時候呢, 另一個 reference 當然也會,你再走過去,就也會看到東西被改掉。 那我們來圖解一下,第一個 statement,aList = [1,2,3] 的時候,我們會發現 它長這個樣子,aList 就像是一個 reference 一樣,它會去指向一塊存著 1,2,3 的空間,然後緊接著 bList,bList 等於 aList 這個 assignment 會把 bList 這個 list 做出來,但是做出來的方式並不是做出 一條全新的 list,而是把 aList 內容 copy 給 bList,所以就等於是有兩個地方分別寫著這一塊地 的地址,所以從 aList 過去是同一塊,bList 過去也是同一塊, 那緊接著 statement3,當你透過 bList 去把第一個 element 改成 5 了以後,你再去 aList 做 print out,當然結果就會一模一樣。 好,所以既然是如此,我們就會發現,所以 aList 跟 bList 確實不是兩個 list,它事實上是一個 single list 的兩個名字,這樣子,如果能理解到這個程度的話,那對於我們今天為什麼 aList 的內容也會被改掉就可以理解啦。 那也就是說啦,那老師我理論上應該要有辦法解決這個問題,對吧?有的,就是你在這裡 我們今天呢想要複製一個 list 的時候,你不能只是這樣子複製它的名稱,這樣不夠, 你必須要自己先開一個空的 list, 然後呢你要寫一個迴圈,把 aList 內容一個一個地 append 到 bList 裡面去, 這樣子的話就可以,那我們很快地試一下。 好,今天呢就是這個地方,那我們來這裡試試 看,我們這個叫它 anotherList,也 OK,我們就叫它 anotherList, 一開始給它空的,然後呢我就,我要有一個迴圈,去把 aList 里的東西跑一遍,那我就說,好, 讓 i 依序是 aList 裡面的每一個東西,然後我要做的事情是我要 讓 anotherList 去 append 我的 i,OK 每當我把 i 拿出來了以後,我就把它塞進 anotherList,一次一次又一次, 那麼這三行就會實現把 aList 的內容完全複製給 anotherList,那你接著再去改 anotherList 的話,我們來看看 aList 會發生什麼事情, 1,2,3,aList 就不會被改到了,那你如果 也試著 print out anotherList 的話,就是 5,2,3,那希望這樣子呢 就完整的解說讓大家明白了。 那麼你可能接著會有第二個問題,就是我什麼時候會去做這種 list copying 的事情,那這個很難講了,每個人的寫作習慣不一樣,是有可能的, 而且我們之後的課程會跟大家介紹函數, 你會寫自己的函數,傳自己的參數進去,然後在函數裡面做事情, 傳參數到函數里的時候呢,就會發生參數的複製 所以你傳 list 給函數,就會發生複製,就會發生我們這裡說的這個情況, 那可能就需要注意了,不過呢之後的事情,暫時呢就先不要管它,就好了。