函數的參數傳遞(轉)
阿新 • • 發佈:2017-12-22
clas 傳遞 輸出結果 blog pen 指向 ron list 不可
如下代碼:
也就是Python在傳遞參數時在可變對象和不可變對象的傳遞上是有區別的。
如上所述,我們知道,對於不可變對象,並不會改變對象自身的值,只會創建新的對象,那麽,我們只需要將新創建的對象利用函數返回到d即可,代碼如下:
作者:oYabea
鏈接:https://www.zhihu.com/question/20591688/answer/128044544
來源:知乎
首先說python傳遞參數的問題,python有可變對象(比如列表)和不可變對象(比如字符串),在參數傳遞是分為兩種情況
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在傳遞參數時在可變對象和不可變對象的傳遞上是有區別的。
defadd(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
作者:oYabea
鏈接:https://www.zhihu.com/question/20591688/answer/128044544
函數的參數傳遞(轉)