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
可見,這時的字符串已經不是在原來的基礎上修改了,實際上是返回了一個新字符串。
結論:
對於可以修改的對象,如列表和字典,函數的參數傳遞方式是引用傳遞。
對於不能修改的對象,包括字符串、一般變量和元組(元組本來就不能修改),參數傳遞的方式是值傳遞。如果確實需要修改該對象的值,可以利用函數的返回值進行修改。
