Reference

參照

何謂參照(reference)?reference在程式語言中非常重要,不同的程式語言,其參照的設計可能不同, 我們先看看python的參照是如何。

這邊說明一下,學軟體的有個問題,常常不知道該表達中文還是英文,其實表達英文最能直接貼近原本的意義, 因為這些名詞的發明,本來就是由發明者以當初的語言決定的。

所以我這邊都會盡量列出中文,但未來仍以英文為主要描述語言。

我們來看看以下的範例:

apple = 100
banana = apple
print(apple)
print(banana)

apple = 10
print(apple)
print(banana)

appleList = [1, 2, 3]
bananaList = appleList
print(appleList)
print(bananaList)

appleList[0] = 100
print(appleList)
print(bananaList)

從這個程式我們發現什麼,我們以為appleList[0] = 100不會影響bananaList的結果,但事實上則不然, print(bananaList)會印出跟appleList一樣的東西, 所以不論我們對appleList怎麼修改,bananaList都會跟著變,也就是appleList 其實就是 bananaList。

但是為什麼apple跟banana卻沒有這樣的關係呢?

原因是因為list在程式語言中是以參照的方式指派給變數, 我們假設appleList在電腦中是以一串數字表示,比方說135579,(就像是學號一樣,學號代表著一個學生) 那麼bananaList = appleList實際上是將135579指派給bananaList, 而135579則實際上指著實際的值,也就是[1, 2, 3],所以我們對bananaList與appleList所做的修改, 其實都是對著135579所指的東西修改,所以修改appleList就會修改到bananaList了。

這樣的觀念跟物件導向其實很有關係,待我們講到物件導向的時候,再回來複習一遍。

傳reference給函式

我們再看一下這個範例:

def changeList(aList, index, value):
    aList[index] = value
    print('aList: ' + str(aList))
    
fruits = ['apple', 'banana', 'cherry']
print('fruits: ' + str(fruits))
changeList(fruits, 1, 'coconut')
print('fruits: ' + str(fruits))

我們發現當我們將fruits傳進去一個函式時,我們在函式中修改了其中一個值,在外層中的fruits的值也變了,這也是因為我們將fruits的參照傳給了函式, 所以在函式中對同一個參照的修改,當然會影響到外層同一個參照的變數。

所以當指派發生時,我們要注意str, int, float, complex型別是值的指派,而比較複雜的資料則是reference的指派。

Last updated

Was this helpful?