Python 函式的引數傳遞
阿新 • • 發佈:2018-11-07
本文轉載自:https://www.cnblogs.com/lustar/p/8393922.html
C/C++中,傳遞引數的型別是可以指定的。一般來說,傳遞引數可以分為兩種:值傳遞和引用傳遞。對於值傳遞,引數傳遞的過程中進行了複製操作,也就是說,在函式中對引數的任何改動都不會影響到傳入的變數;對於引用傳遞,函式中的物件與傳入的物件其實是同一個物件,也就是說,引數僅僅是原物件的一個引用。一般來說,C/C++預設的方式都是值傳遞,要改變原物件,可採用顯式的引用或者指標傳遞的方式。
那麼,在Python中呢?Python語言中顯然沒有能指定傳遞型別的語法,畢竟是一門動態的解釋型語言,也沒有顯式的型別要求。
下面驗證Python函式引數傳遞的方式:
def changelist(lst): #修改列表
lst[0] = '1'
lst = [111, 2, 3, 4]
changelist(lst)
print(lst)
def changedict(dic): #修改字典
dic["lustar"] ="yes"
dict1 = {"lustar": "no"}
changedict(dict1)
print(dict1)
輸出結果為:
['1', 2, 3, 4]
{'lustar': 'yes'}
可見,對於列表和字典,引數傳遞的方式是引用傳遞。
def changestring(string1): #修改字串
string1 += "None"
str1 = "I am a good boy!"
changestring(str1)
print(str1)
def changevar(a): #修改變數
a += 111
b = 1
changevar(b)
print( b )
輸出結果為:
I am a good boy! 1
可見,對於字串以及一般的變數,結果類似於值傳遞,並不會影響到原結果。那麼,如果想改變字串的值呢?返回新的字串即可:
def changestring(string1): string1 += "None" return string1 #修改後的引數作為返回值 str1 = "I am a good boy!" print( id(str1)) str1 = changestring(str1) print (str1) print (id(str1))
輸出結果為:
31869336 I am a good boy!None 31867712
可見,這時的字串已經不是在原來的基礎上修改了,實際上是返回了一個新字串。
結論:
對於可以修改的物件,如列表和字典,函式的引數傳遞方式是引用傳遞。
對於不能修改的物件,包括字串、一般變數和元組(元組本來就不能修改),引數傳遞的方式是值傳遞。如果確實需要修改該物件的值,可以利用函式的返回值進行修改。