函数调用时:* **的作用就是解包,把一个整体(元组或字典)分解成一个个个体,生成多个参数,与位置参数或默认参数对应。如果没有传*号,它就是一个个体,一个参数。

def test_kwargs(first, *args, **kwargs):
print('first:',first)
print('args:',args)
print('kwargs:',kwargs)


arg=(2, 3, 4)
kw={'k1':5, 'k2':6}


test_kwargs(1,arg,kw )  #这里传arg,kw之后,要经过打包成一个元组,认为是一个参数

#first: 1
#args: ((2, 3, 4), {'k1': 5, 'k2': 6})  
#kwargs: {}

test_kwargs(1,*arg,**kw )#这里传*arg,**kw之后,要经过解包。**kw相等于k1=5,k2=6。 这里必须时**kw,而不是*kw。

#first: 1
#args: (2, 3, 4)
#kwargs: {'k1': 5, 'k2': 6}

test_kwargs(1,*arg,*kw )  #如果字典标记一个*,也很合并到args中,并且只有key值。

#first: 1
#args: (2, 3, 4,'k1','k2')
#kwargs: {}

 

test_kwargs(1,kw=kw )

#first: 1

#args: ()
#kwargs: {'kw': {'k1': 5, 'k2': 6}} #重组

 

-----------------------------------------------------解包

def test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)

args = ("two", 3, 5)
test_args_kwargs(*args)
kwargs = {"arg3": 14, "arg2": "two", "arg1": 5}
test_args_kwargs(**kwargs)

---------------------------------------------------------------