# Copy Module

## 使用copy模組

有了reference這種東西，我們就希望對reference有更好的操控。 我們來看看以下的範例:

```python
import copy

def changeList(aList, index, value):
    aList[index] = value
    print('aList: ' + str(aList))

print('before copy.copy()')
listOfList = [['apple', 'banana', 'cherry'], [1, 4, 9, 16]]
changeList(listOfList[0], 0, 'test')
print('listOfList: {}'.format(listOfList))
print('--------------------------------')

print('after copy.copy()')
listOfList = [['apple', 'banana', 'cherry'], [1, 4, 9, 16]]
copyListOfList = copy.copy(listOfList)
changeList(copyListOfList, 0, ['test'])
print('listOfList: {}'.format(listOfList))
print('--------------------------------')

print('after copy.copy()')
listOfList = [['apple', 'banana', 'cherry'], [1, 4, 9, 16]]
copyListOfList = copy.copy(listOfList)
changeList(copyListOfList[0], 0, 'test')
print('listOfList: {}'.format(listOfList))
print('--------------------------------')

print('after copy.deepcopy()')
listOfList = [['apple', 'banana', 'cherry'], [1, 4, 9, 16]]
deepCopyListOfList = copy.deepcopy(listOfList)
changeList(deepCopyListOfList, 0, ['test'])
print('listOfList: {}'.format(listOfList))
print('--------------------------------')

print('after copy.deepcopy()')
listOfList = [['apple', 'banana', 'cherry'], [1, 4, 9, 16]]
deepCopyListOfList = copy.deepcopy(listOfList)
changeList(deepCopyListOfList[0], 0, 'test')
print('listOfList: {}'.format(listOfList))
print('--------------------------------')
```

這邊示範使用copy模組來複製list，由於我們可能有某個時機會將串列或類似的資料結構傳入函式，但是我們卻想複製一份list，在函式裡使用， 卻不想影響到原本的list，這時我們就需要copy模組，而copy.copy()只是shallow copy，copy.deepcopy()則是deep copy，也就是說， 所有裡面的任何以reference存在的變數，都會是新的一份copy，彼此之間不互相影響。

參照這個東西，在別的程式語言可能以address的名字存在，實際上都牽扯到程式語言原本的設計，我們只要記得變數到底存著值， 還是存著reference or address，我們就會知道自己的變數目前是什麼狀態。
