Python 中*args和**kargs,*和 **的作用详解
首先明确Python中*和**和C中不一样不是指针,理解起来也比较容易。
1、如果函数形参中有*args和**kargs,表示可以将不定长的参数传入。
args和kargs只是形参名,可以换成别的,只不过一般统一写成这两个而已。*args是不定长的位置参数,而**kargs则是不定长的键值对参数,*args必须写在 ** kargs的前面。 *args可以将不定长的参数打包成一个元组传入,而 ** kargs可以将不定长的键值对参数打包成字典传入。例如:
def test(a, b, *args, **kargs):
print(a)
print(b)
print(args)
print(kwargs)
test(1, 2, 3, 4, 5, names='aa', age=18)
输入结果:
1
2
(3, 4, 5)
{'names': 'aa', 'age': 18}
可以看到对于剩下的位置参数3,4,5打包成一个元组给了args,键值对 names=‘aa’, age=18打包成一个字典给了kargs。
2、如果不是在函数形参中出现* 和**,那么*的** 作用变成拆包,*表示将元组拆包而**则表示将字典拆成键值对形式。
例如:
def test2(names, age):
print('names={}'.format(names))
print('age={}'.format(age))
def test(a, b, *args, **kargs):
print(a)
print(b)
print(*args)
test2(**kargs)
test(1, 2, 3, 4, 5, names='aa', age=18)
输出结果如下:
1
2
3 4 5
names=aa
age=18
和上面的例子对比可以看到,函数中的*args把(3,4,5)拆开了,而**则把字典{‘names’: ‘aa’, ‘age’: 18}拆成names=’aa’和age=18传给了test2()。