*args 和 **kwargs
在 Python 中,*args 和 **kwargs 是用于处理函数参数的两种特殊语法,它们的核心区别在于处理参数的类型和方式。以下是详细对比:
1. *args(单星号)
-
作用:
用于接收任意数量的位置参数(非关键字参数),并将这些参数打包成一个元组(tuple)。 -
使用场景:
当函数需要接受不确定数量的位置参数时。 -
示例:
def sum_numbers(*args): total = 0 for num in args: total += num return total print(sum_numbers(1, 2, 3)) # 输出 6 print(sum_numbers(4, 5)) # 输出 9
-
关键点:
-
参数以元组形式存储(如
args = (1, 2, 3))。 -
必须定义在普通参数之后(如
def func(a, b, *args))。 -
调用时可以直接传递多个值(如
func(1, 2, 3, 4))。
-
2. **kwargs(双星号)
-
作用:
用于接收任意数量的关键字参数(键值对参数),并将这些参数打包成一个字典(dict)。 -
使用场景:
当函数需要接受不确定数量的关键字参数时。
示例:
def print_user_info(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") print_user_info(name="Alice", age=30, city="New York") # 输出: # name: Alice # age: 30 # city: New York
-
关键点:
-
参数以字典形式存储(如
kwargs = {"name": "Alice", "age": 30})。 -
必须定义在
*args之后(如def func(a, *args, **kwargs))。 -
调用时需以
key=value形式传递参数(如func(name="Bob", age=25))。
-
3. 核心区别总结
| 特性 | *args | **kwargs |
|---|---|---|
| 参数类型 | 位置参数(非关键字参数) | 关键字参数(键值对参数) |
| 存储形式 | 元组(tuple) |
字典(dict) |
| 调用方式 | func(1, 2, 3) |
func(name="Alice", age=30) |
| 顺序要求 | 必须定义在普通参数之后 | 必须定义在 *args 之后 |
4. 联合使用示例
*args 和 **kwargs 可以同时使用,以接受任意参数:
def func(a, b, *args, **kwargs): print(f"a={a}, b={b}") print(f"args={args} (类型: {type(args)})") print(f"kwargs={kwargs} (类型: {type(kwargs)})") func(1, 2, 3, 4, x=5, y=6) # 输出: # a=1, b=2 # args=(3, 4) (类型: <class 'tuple'>) # kwargs={'x': 5, 'y': 6} (类型: <class 'dict'>)
5. 参数解包(反向操作)
除了在函数定义中使用,* 和 ** 还可用于调用函数时解包参数:
解包列表/元组:*
numbers = [1, 2, 3] sum_numbers(*numbers) # 等效于 sum_numbers(1, 2, 3)
解包字典:**
params = {"name": "Bob", "age": 25}
print_user_info(**params) # 等效于 print_user_info(name="Bob", age=25)
6. 注意事项
-
命名约定:
args和kwargs只是约定俗成的名称,实际可以用其他名字(如*values或**options),但需保留*和**。 -
参数顺序:
函数定义中参数的顺序必须为:普通参数 →*args→**kwargs(否则会报语法错误)。
7. 实际应用场景
-
*args的用途:
实现可变参数的计算(如求平均值)、代理模式(将参数传递给其他函数)。 -
**kwargs的用途:
处理配置参数、动态生成类的属性、扩展父类方法时保留参数灵活性。
总结:*args 处理位置参数,**kwargs 处理关键字参数。它们让函数能灵活应对不确定数量的输入,是 Python 动态特性的重要体现。

浙公网安备 33010602011771号