Python編程技術:函數的參數傳遞*args和**kwargs
參數傳遞
參數傳遞機制
:python函數的參數傳遞具有值傳遞
(int、float等值數據類型)和引用傳遞
(以字典、列表等非值對象數據類型爲代表)兩種基本機制。
值傳遞,應用的參數不發生更改
。(傳了個副本進去)
a = 5
def test(a):
a+=1
print("函數內:%d" % a)
test(a)
print(a)
結果:
函數內:6
5
引用傳遞,引用的參數發生更改
(傳的是真實的地址)
a = [1,2,3]
def test(a):
a.append(4)
print("函數內:",a)
test(a)
print(a)
結果:
函數內: [1, 2, 3, 4]
[1, 2, 3, 4]
*args和**kwargs
python中還允許包裹方式的參數傳遞,這爲不確定參數個數和參數類型
的函數調用提供了基礎:
知識點:
在函數調用時,*會以單個元素的形式解包一個元祖
,使其成爲獨立的參數。
在函數調用時,**會以鍵/值對的形式解包一個字典
,使其成爲獨立的關鍵字參數。
*args參數傳遞例子:
def f(a,*args):
print(args)
f(1,2,3,4)
輸出爲:(2, 3, 4)
再看看**kwargs的參數傳遞的例子:
def f(**kargs):
print(kargs)
f(a=1,b=2) # 實際傳入參數是兩個,但是給包裹在一起
輸出爲:{'a': 1, 'b': 2}
在python中,當 *args和**kwargs符號出現在函數定義的參數中時,表示任意數目參數。
*arg表示任意多個無名參數,類型爲tuple;**kwargs表示關鍵字參數,爲dict,
使用時需將*arg放在**kwargs之前,否則會有“SyntaxError: non-keyword arg after keyword arg”的語法錯誤。
再看看*args 和 **kwargs混合的例子
def h(a,*args,**kwargs):
print(a,args,kwargs)
h(1,2,3,x=4,y=5)
# 丟進去不確定參數的包裹:1,2,3,x=4,y=5
# 解包:1 -a
# 解包:(2,3) -*args
# 解包:{'x': 4, 'y': 5} -**kwargs
output: 1 (2, 3) {'x': 4, 'y': 5}