前言
串列也可以做為引數在函式之間被傳遞。若函式之間傳遞的引數為串列元素,則其引數傳遞的方式是屬於傳值呼叫。若函式之間傳遞的引數是整個串列,則其引數傳遞的方式為參考呼叫。
傳遞串列元素
函式之間的引數如果是使用串列元素傳遞,就與使用變數傳遞的情況一樣,皆為傳值呼叫。
[簡例] 建立Triple()函式,使傳入的引數變成三倍。觀察函式呼叫前、呼叫時、呼叫後,其相對的實引數與虛引數之間變化情況。 (檔名:callByValue.py)
[結果]
呼叫 Triple() 函式前 ⋯
x = 10 A[1] = 4
執行 Triple()函式 ------
x = 30 y = 12
呼叫 Triple() 函式後 ⋯
x = 10 A[1] = 4程式碼: callByValue.py
# 呼叫函式時,傳遞參數的方式有兩種:傳值呼叫 (Call by Value) 與傳址呼叫 (Call by Reference)。 # 在 Python 中,所有的參數都是以「傳值呼叫」的方式傳遞,但對於可變物件 (如 list、dict 等) 的參數,函式內部對其進行修改時,會影響到原始物件,這種情況看起來像是「傳址呼叫」。 # 以下範例說明了傳值呼叫的概念,對於不可變物件 (如 int、float、str 等) 的參數,函式內部對其進行修改時,不會影響到原始物件。 def Triple(x, y): # 將傳入的參數 x 乘以 3 x = x * 3 # 將傳入的參數 y 乘以 3 y = y * 3 print('執行 Triple() 函式 ------') # 輸出函式內部的 x 與 y 的值 print(f'x = {x} y = {y}') print() x = 10 A = [2, 4, 6, 8] print('呼叫 Triple() 函式前 ------') # 輸出函式外部的 x 與 A[1] 的值 => x = 10 A[1] = 4 print(f'x = {x} A[1] = {A[1]}') print() # 呼叫 Triple() 函式,傳入 x 與 A[1] 作為參數 Triple(x, A[1]) # x = 30 y = 12 # 輸出函式外部的 x 與 A[1] 的值,觀察是否受到函式內部修改的影響 print('呼叫 Triple() 函式後 ------') # 輸出函式外部的 x 與 A[1] 的值 => x = 10 A[1] = 4 print(f'x = {x} A[1] = {A[1]}') ```
傳遞整個串列
若函式之間的引數使用整個串列傳遞時,則為參考呼叫。此種情況在呼叫敘述中的實引數必須使用要傳入的串列名稱,因串列名稱是編譯器分配給串列占用記憶體的起始位址。而在被呼叫函式對應的虛引數,也會是一個串列。
[簡例] 建立Triple()函式,傳入的引數為串列名稱,並傳入的串列各元素變成三倍。觀察函式呼叫前、呼叫時、呼叫後,其相對的串列實引數與串列虛引數之間的變化情況。 (檔名:callByRef.py)
[結果]
呼叫 Triple() 函式前⋯⋯⋯
串列 arr = [2,4,6,8,10]
執行 Triple() 函式 ------
串列 lst=[6,12,18,24,30]
呼叫 Triple() 函式後⋯⋯⋯
串列 arr = [6,12,18,24,30]程式碼: callByRef.py
def Triple(lst): for i in range(len(lst)): lst[i] = lst[i] * 3 print('執行 Triple() 函式 ------') print(f'串列 lst = {lst}') print() arr = [2, 4, 6, 8, 10] print('呼叫 Triple() 函式前 ------') print(f'串列 arr = {arr}') print() Triple(arr) print('呼叫 Triple() 函式後 ------') print(f'串列 arr = {arr}')
相關主題與延伸閱讀
- 4. 引數的傳遞方式:先備知識,了解傳值呼叫與參考呼叫的差異。
- 2. 一維串列:了解串列的基本操作,作為函式引數的先備知識。
- 3. 使用迴圈操作串列:搭配迴圈走訪傳入函式的串列元素。
- 3. 自定函式:了解如何定義能接收串列引數的自定函式。