1. 程式人生 > >python函式傳遞引數方式,值傳遞 or 引用傳遞

python函式傳遞引數方式,值傳遞 or 引用傳遞

首先說說Python中引數傳遞的問題,Python中有可變物件(比如列表List)和不可變物件(比如字串),在引數傳遞時分為兩種情況:

  1. 對於不可變物件作為函式引數,相當於C系語言的值傳遞;
  2. 對於可變物件作為函式引數,相當於C系語言的引用傳遞。

我們可以分析下樓主的程式碼,引數為不可變物件:

def add(num):
    num = num + 10
d = 2
add(d)
print d

 

理所當然的輸出2,為什麼呢?定義了一個變數d,d指向數字2,然後執行add方法,是複製d到num,剛開始num也指向數字2,在函式體內給num+10,整數是不可變物件,所以,將num+10的結果賦值給num變數,此時num指向num+10也就是12,而d本身並沒有發生改變,仍然指向2。

在Python中,對於不可變物件,呼叫自身的任意方法,並不會改變物件自身的內容,這些方法會建立新的物件並返回,保證了不可變物件本身是永遠不可變的。

當引數為可變物件時,這裡我們以列表list舉例說明:

如下程式碼:

def change(num):
    num.append(1)
d = [0]
change(d)
print d 

上述程式碼的輸出結果為 [0,1],現在來分析原因。執行change()方法時,num指向列表[0],因為列表是可變物件,直接作用在原來list上並不會產生新的物件,所以返回[0,1]。
也就是Python在傳遞引數時在可變物件和不可變物件的傳遞上是有區別的。

回到樓主的問題:

這段程式碼

def add(num):
    num = num + 10

d=2
add(d)
print d

輸出 2

如果我要像C那樣傳遞d的地址,使之輸出12,我應該怎麼做?

如上所述,我們知道,對於不可變物件,並不會改變物件自身的值,只會建立新的物件,那麼,我們只需要將新建立的物件利用函式返回到d即可,程式碼如下:

def add(num):
    num = num + 10
    return num

d = 2
d = add(d)
print d