python中*args和**kwargs的区别

当函数的参数(个数)不确定时,可以使用*args**kwargs,*args表示参数没有key值,也就是无名参数,是一个tuple,**表示参数有key值,也就是关键字参数,是一个dict。


代码示例:

1
2
3
4
5
6
7
8
9
10
11
def foo(*args, **kwargs):
print('args = ', args)
print('kwargs = ', kwargs)
print('---------------------------------------')
if __name__ == '__main__':
foo(1, 2, 3, 4)
foo(a=1, b=2, c=3)
foo(1, 2, 3, 4, a=1, b=2, c=3)
foo('a', 1, None, a=1, b='2', c=3)

输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
args = (1, 2, 3, 4)
kwargs = {}
---------------------------------------
args = ()
kwargs = {'c': 3, 'a': 1, 'b': 2}
---------------------------------------
args = (1, 2, 3, 4)
kwargs = {'c': 3, 'a': 1, 'b': 2}
---------------------------------------
args = ('a', 1, None)
kwargs = {'c': 3, 'a': 1, 'b': '2'}
---------------------------------------

需要特别提出注意的一点是,在同时使用*args和**kwargs时,*args参数必须要在**kwargs前,像foo(a=1, b=’2’, c=3, a’, 1, None, )这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”