# Reference

## 參照

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

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

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

我們來看看以下的範例:

```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給函式

我們再看一下這個範例：

```python
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的指派。
