一、基本概念
在Python中,傳遞參數指的是函數或方法中的參數傳輸方式。Python中的參數傳遞有兩種方式,分別為「傳值調用」和「傳引用調用」。
所謂「傳值調用」,是指在傳參時,將原始變數的值複製一份傳入函數中參與運算操作。傳值調用不會改變原始變數的值,在函數內部改變參數的值,不會對原始變數造成影響。而所謂「傳引用調用」,則是在傳參時,將原始變數的引用地址傳給函數,在函數內部改變參數的值,會對原始變數造成影響。
在Python中,函數和方法的參數傳遞默認採用「傳值調用」方式。
二、傳值調用
在Python中,傳值調用又分為對不可變對象(如:數字、字元串、元組)和可變對象(如:列表、字典)進行傳參,不同類型的對象傳參方式也有所不同。
1、對不可變對象進行傳參
不可變對象的值一旦賦值就無法改變,因此將其傳遞給函數時,只是將其值複製一份傳遞給函數。在函數內部對參數進行修改不會對原始變數造成影響。
def change_number(num):
num += 10
number = 10 # 定義一個變數
change_number(number) # 調用函數
print(number) # 輸出結果為10
上述代碼將數字類型的變數number傳遞給change_number()函數中,在函數內部對num進行加10操作,但是並不會對原始變數number造成影響。
2、對可變對象進行傳參
而對於可變對象的傳參,則與不可變對象不同,將其傳遞給函數時,傳遞的是原始對象的引用地址,即傳遞的是對象的指針,這意味著對其進行操作時會對原始變數造成影響。
def change_list(alist):
alist.append(4)
list1 = [1, 2, 3] # 定義一個列表
change_list(list1) # 調用函數
print(list1) # 輸出結果為 [1, 2, 3, 4]
上述代碼將列表類型的變數list1傳遞給change_list()函數中,函數在內部對list1進行了操作,結果會對原始變數造成影響,最終輸出的結果為[1, 2, 3, 4]。
三、傳引用調用
在Python中,使用特定的方式來實現傳引用調用,通過使用import引入copy模塊,在函數內部對參數進行修改時,不會對原始變數造成影響。
import copy
def change_dict(adict):
adict["name"] = "Tom"
dict1 = {"name":"Jack", "age":21} # 定義一個字典
dict2 = copy.copy(dict1) # 使用copy模塊拷貝一個字典
change_dict(dict2) # 調用函數
print(dict1) # 輸出結果為 {"name":"Jack", "age":21}
print(dict2) # 輸出結果為 {"name":"Tom", "age":21}
上述代碼引入了copy模塊,並使用copy()函數對字典進行拷貝,將字典dict1拷貝給字典dict2。然後將字典dict2傳遞給change_dict()函數中,函數內對字典dict2進行了修改,但是原始字典dict1並沒有受到影響,輸出的結果也能夠證明這點。
四、總結:
Python中,參數傳遞可以使用「傳值調用」和「傳引用調用」兩種方式,對於不可變對象的傳參,使用「傳值調用」的方式,並且不會對原始變數造成影響;對於可變對象的傳參,則使用「傳引用調用」的方式,並且對原始變數造成影響。在Python中,如果需要在函數內部修改某個對象的值,可以在函數內部先使用copy()函數對其進行拷貝,這樣就能夠保證函數內部修改的對象不會對原始變數造成影響。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/305002.html