1. 程式人生 > 實用技巧 >函式值傳遞和引用傳遞(包括形式引數和實際引數的區別)

函式值傳遞和引用傳遞(包括形式引數和實際引數的區別)

通常情況下,定義函式時都會選擇有引數的函式形式,函式引數的作用是傳遞資料給函式,令其對接收的資料做具體的操作處理。

在使用函式時,經常會用到形式引數(簡稱“形參”)和實際引數(簡稱“實參”),二者都叫引數,之間的區別是:

  • 形式引數:在定義函式時,函式名後面括號中的引數就是形式引數,例如:
    #定義函式時,這裡的函式引數 obj 就是形式引數
    def demo(obj)
        print(obj)
  • 實際引數:在呼叫函式時,函式名後面括號中的引數稱為實際引數,也就是函式的呼叫者給函式的引數。例如:
    a = "C語言中文網"
    #呼叫已經定義好的 demo 函式,此時傳入的函式引數 a 就是實際引數
    demo(a)

實參和形參的區別,就如同劇本選主角,劇本中的角色相當於形參,而演角色的演員就相當於實參。


明白了什麼是形參和實參後,再來想一個問題,那就是實參是如何傳遞給形參的呢?

Python中,根據實際引數的型別不同,函式引數的傳遞方式可分為 2 種,分別為值傳遞和引用(地址)傳遞:

  1. 值傳遞:適用於實參型別為不可變型別(字串、數字、元組);
  2. 引用(地址)傳遞:適用於實參型別為可變型別(列表,字典);


值傳遞和引用傳遞的區別是,函式引數進行值傳遞後,若形參的值發生改變,不會影響實參的值;而函式引數繼續引用傳遞後,改變形參的值,實參的值也會一同改變。

例如,定義一個名為 demo 的函式,分別為傳入一個字串型別的變數(代表值傳遞)和列表型別的變數(代表引用傳遞):

def demo(obj) :
    obj += obj
    print("形參值為:",obj)
print("-------值傳遞-----")
a = "C語言中文網"
print("a的值為:",a)
demo(a)
print("實參值為:",a)
print("-----引用傳遞-----")
a = [1,2,3]
print("a的值為:",a)
demo(a)
print("實參值為:",a)

執行結果為:

-------值傳遞-----
a的值為: C語言中文網
形參值為: C語言中文網C語言中文網
實參值為: C語言中文網
-----引用傳遞-----
a的值為: [1, 2, 3]

形參值為: [1, 2, 3, 1, 2, 3]
實參值為: [1, 2, 3, 1, 2, 3]

分析執行結果不難看出,在執行值傳遞時,改變形式引數的值,實際引數並不會發生改變;而在進行引用傳遞時,改變形式引數的值,實際引數也會發生同樣的改變。

對於初學者來說,本節只需要瞭解形參和實參,值傳遞和引用傳遞的區別即可。對於函式引數的傳遞方法,如果讀者想深入探究其原因,可閱讀《Python函式引數傳遞機制》一節。