众所周知,python的args是用来接收不定长的参数,而kwargs是用来接收不定长的关键字参数。
下面通过实例来看看如何真正的理解这两个的用法。
def test2(a, b, *args, **kwargs):
print("------test2---------")
print(a)
print(b)
print(args)
print(kwargs)
def test1(a, b, *args, **kwargs):
print("-------test1---------")
print(a)
print(b)
print(args)
print(kwargs)
print("The output of a, b, args, kwargs")
test2(a, b, args, kwargs)
print("The output of a, b, *args, kwargs")
test2(a, b, *args, kwargs)
print("The output of a, b, *args, **kwargs")
test2(a, b, *args, **kwargs)
test1(11,22,33,44,55,66, name="zhangsan", age=18)
The output of the test code like following:
-------test1---------
11
22
(33, 44, 55, 66)
{‘name’: ‘zhangsan’, ‘age’: 18}
The output of a, b, args, kwargs
------test2---------
11
22
((33, 44, 55, 66), {'name': 'zhangsan', 'age': 18})
{}
从这个结果来看,(33, 44, 55, 66), {‘name’: ‘zhangsan’, ‘age’: 18}被作为一个整体传给了test2函数的args对象;然后kwargs没有实参。
The output of a, b, *args, kwargs
------test2---------
11
22
(33, 44, 55, 66, {'name': 'zhangsan', 'age': 18})
{}
从这个结果来看,(33, 44, 55, 66, {‘name’: ‘zhangsan’, ‘age’: 18})被作为一个整体传给了test2函数的args对象;然后kwargs没有实参。
The output of a, b, *args, **kwargs
------test2---------
11
22
(33, 44, 55, 66)
{'name': 'zhangsan', 'age': 18}
从这个结果来看,(33, 44, 55, 66)被作为一个整体传给了test2函数的args对象; {‘name’: ‘zhangsan’, ‘age’: 18}传给了kwargs参数,这个才是我们期待的结果。
总结起来,可以这么理解,*args可以理解为对实参的一个拆包,**args也是对实参的拆包。不带星花就不拆包,会被当做一个整体。