定义
*args
和**kwargs
是编程人员约定的变量名字,args
是arguments
的缩写,表示位置参数;kwargs
是keyword arguments
的缩写,表示关键字参数。- 这其实就是 Python 中可变参数的两种形式, 并且
*args
必须放在**kwargs
的前面, 因为位置参数在关键字参数的前面 *args
和**kwargs
长度可变, 可以为0
实例
def func(*args, **kwargs):
print(args, type(args))
print(args[1])
print(kwargs, type(kwargs))
print(kwargs.get('c'))
func('a', [1, 2, 'a'], c='c', d='d')
('a', [1, 2, 'a']) <class 'tuple'>
[1, 2, 'a']
{'c': 'c', 'd': 'd'} <class 'dict'>
c
可以理解为有两个参数分别是:
args=('a', [1, 2, 'a'])
kwargs={'c': 'c', 'd': 'd'}
然后对其进行了解包操作之后传入函数, 也就是*
和**
解包
把容器类型list、tuple、dict、set中的元素拆开
**{'c': 'c', 'd': 'd'}
就是拆成'c'='c'
和'd'='d'
两个元素
*('a', [1, 2, 'a'])
就是拆成 'a'
和 [1, 2, 'a']
两个元素
当然还能接着拆[1, 2, 'a']
这个元素,*('a', *[1, 2, 'a'])
拆成'a'
、1
、2
、'a'
四个元素
在上面的例子中
func('a', [1, 2, 'a'], c='c', d='d')
与func(*('a', [1, 2, 'a']), **{'c': 'c', 'd': 'd'})
可以近似理解为等价