← 返回首页

Python 中的 *args 和 **kwargs 表示什么?

在 Python 中,*args 和 **kwargs 是用于处理可变数量参数的特殊语法。它们允许函数接收不确定数量的参数,极大地增强了函数的灵活性。

1. *args:接收任意数量的位置参数

*args 允许你将多余的位置参数打包成一个元组(tuple)。

  • 命名约定:虽然通常写成 args,但 * 后面的名字是任意的(如 *a, *my_params 都可以),但 Python 社区约定俗成使用 *args。
def my_func(*args):
    print(type(args))  # <class 'tuple'>
    for arg in args:
        print(arg)

my_func(1, 2, 3)

输出:

<class 'tuple'>

1

2

3

2. **kwargs:接收任意数量的关键字参数

**kwargs 允许你将多余的关键字参数打包成一个字典(dict)。

  • 命名约定:同样,** 后面的名字也是任意的,但社区约定俗成使用 kwargs(keyword arguments)。
def my_func(**kwargs):
    print(type(kwargs))  # <class 'dict'>
    for key, value in kwargs.items():
        print(f"{key}: {value}")

my_func(name="Alice", age=25)

输出:

<class 'dict'>

name: Alice

age: 25

3. 组合使用与参数顺序

在实际开发中,它们经常和普通参数一起使用。Python 对参数的定义顺序有严格规定: 普通参数 -> *args -> 关键字参数 -> **kwargs

def complex_func(a, b, *args, key1="default", **kwargs):
    print(f"a={a}, b={b}")
    print(f"args={args}")
    print(f"key1={key1}")
    print(f"kwargs={kwargs}")

complex_func(1, 2, 3, 4, key1="custom", x=10, y=20)

输出:

a=1, b=2

args=(3, 4)

key1=custom

kwargs={'x': 10, 'y': 20}

4. 解包操作(Unpacking)

除了用于函数定义,* 和 ** 在函数调用时也可以用来“解包”元组或字典,将其转换为位置参数或关键字参数传入:

def add(a, b, c):
    return a + b + c

解包列表作为位置参数

my_list = [1, 2, 3]
print(add(*my_list)) # 等价于 add(1, 2, 3),输出 6

解包字典作为关键字参数

my_dict = {"a": 10, "b": 20, "c": 30}
print(add(**my_dict)) # 等价于 add(a=10, b=20, c=30),输出 60

总结:*args 是位置参数的打包/解包器(元组),**kwargs 是关键字参数的打包/解包器(字典)。它们是 Python 实现装饰器、高阶函数和灵活 API 设计的重要基石。