在Python中,*args
和**kwargs
是处理可变数量参数的两种机制,主要区别如下:
1. 参数类型与数据结构
-
*args
:用于接收任意数量的位置参数(非关键字参数),这些参数会被打包成一个元组(tuple
)传递给函数。 -
**‌kwargs
:用于接收任意数量的**关键字参数(键值对参数),这些参数会被打包成一个字典**(dict
)传递给函数。
2. 语法与使用场景
-
*args
:- 语法:
def func(*args)
,参数名前加单星号*
。 - 典型场景:实现可变参数的函数(如求和、打印多个值)或包装函数中传递不定数量的位置参数。
- 语法:
-
**‌kwargs
:- 语法:
def func(‌**kwargs)
,参数名前加双星号**‌
。 - 典型场景:处理动态配置(如初始化对象属性)、传递可选的关键字参数。
- 语法:
3. 参数顺序规则
在函数定义中,*args
必须位于普通参数之后,**kwargs
必须位于所有参数(包括*args
)之后。
例如:
def func(a, b, *args, **kwargs):
pass
4. 参数解包功能
-
*args
:可在函数调用时解包序列(如列表、元组)为单独的位置参数
args = (1, 2, 3)
func(*args) # 等价于 func(1, 2, 3)
**‌kwargs
:可在函数调用时解包字典为关键字参数
kwargs = {"x": 1, "y": 2}
func(**kwargs) # 等价于 func(x=1, y=2)
5. 实际应用示例
-
*args
示例:计算任意数量的数字之和。
def sum_all(*args):
return sum(args)
print(sum_all(1, 2, 3)) # 输出 6
**‌kwargs
示例:动态生成对象属性。
class Person:
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
p = Person(name="Alice", age=25)
print(p.name) # 输出 "Alice"
总结
*args
和**kwargs
的核心差异在于:
*args
处理无名参数(元组),‌**kwargs
处理**命名参数**(字典)。- 两者常结合使用以实现高度灵活的函数接口,如装饰器或继承中的参数传递