1. 程式人生 > >Python 函式的引數傳遞

Python 函式的引數傳遞

本文轉載自: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

可見,這時的字串已經不是在原來的基礎上修改了,實際上是返回了一個新字串。

結論

對於可以修改的物件,如列表和字典,函式的引數傳遞方式是引用傳遞。

對於不能修改的物件,包括字串、一般變數和元組(元組本來就不能修改),引數傳遞的方式是值傳遞。如果確實需要修改該物件的值,可以利用函式的返回值進行修改。