首先說說Python中引數傳遞的問題,Python中有可變物件(比如列表List)和不可變物件(比如字串),在引數傳遞時分為兩種情況:
我們可以分析下樓主的程式碼,引數為不可變物件:
理所當然的輸出2,為什麼呢?定義了一個變數d,d指向數字2,然後執行add方法,是複製d到num,剛開始num也指向數字2,在函式體內給num+10,整數是不可變物件,所以,將num+10的結果賦值給num變數,此時num指向num+10也就是12,而d本身並沒有發生改變,仍然指向2。
在Python中,對於不可變物件,呼叫自身的任意方法,並不會改變物件自身的內容,這些方法會建立新的物件並返回,保證了不可變物件本身是永遠不可變的。
當引數為可變物件時,這裡我們以列表list舉例說明:
如下程式碼:
上述程式碼的輸出結果為 [0,1],現在來分析原因。執行change()方法時,num指向列表[0],因為列表是可變物件,直接作用在原來list上並不會產生新的物件,所以返回[0,1]。也就是Python在傳遞引數時在可變物件和不可變物件的傳遞上是有區別的。
回到樓主的問題:
這段程式碼
輸出 2
如果我要像C那樣傳遞d的地址,使之輸出12,我應該怎麼做?
如上所述,我們知道,對於不可變物件,並不會改變物件自身的值,只會建立新的物件,那麼,我們只需要將新建立的物件利用函式返回到d即可,程式碼如下:
首先說說Python中引數傳遞的問題,Python中有可變物件(比如列表List)和不可變物件(比如字串),在引數傳遞時分為兩種情況:
對於不可變物件作為函式引數,相當於C系語言的值傳遞;對於可變物件作為函式引數,相當於C系語言的引用傳遞。我們可以分析下樓主的程式碼,引數為不可變物件:
理所當然的輸出2,為什麼呢?定義了一個變數d,d指向數字2,然後執行add方法,是複製d到num,剛開始num也指向數字2,在函式體內給num+10,整數是不可變物件,所以,將num+10的結果賦值給num變數,此時num指向num+10也就是12,而d本身並沒有發生改變,仍然指向2。
在Python中,對於不可變物件,呼叫自身的任意方法,並不會改變物件自身的內容,這些方法會建立新的物件並返回,保證了不可變物件本身是永遠不可變的。
當引數為可變物件時,這裡我們以列表list舉例說明:
如下程式碼:
上述程式碼的輸出結果為 [0,1],現在來分析原因。執行change()方法時,num指向列表[0],因為列表是可變物件,直接作用在原來list上並不會產生新的物件,所以返回[0,1]。也就是Python在傳遞引數時在可變物件和不可變物件的傳遞上是有區別的。
回到樓主的問題:
這段程式碼
輸出 2
如果我要像C那樣傳遞d的地址,使之輸出12,我應該怎麼做?
如上所述,我們知道,對於不可變物件,並不會改變物件自身的值,只會建立新的物件,那麼,我們只需要將新建立的物件利用函式返回到d即可,程式碼如下: