Python中*args与**kwargs的装包解包机制详解

洛溪
洛溪
发布时间:2026-10-13| 6人浏览过
原创

本文详细解析Python中*args和**kwargs的使用机制。*args用于接收未命名的位置参数并打包为元组,**kwargs用于接收命名参数并打包为字典。文章通过代码示例展示了装包与解包的具体行为,包括在函数定义及调用时的区别,并总结了参数传递时的顺序限制与注意事项,帮助开发者掌握灵活传参技巧。

*args与**kwargs基础概念

在Python函数定义中,*args和**kwargs是两个极为常用的特殊参数形式。

*args的主要作用是接收多余的未命名位置参数,其内部数据类型为元组。

**kwargs的主要作用是接收多余的命名关键字参数,其内部数据类型为字典。

*args可变参数详解

关于可变参数*args的工作原理:


def fun(n, *args):
  print(n)
  print(args)   # 未拆包
  print(*args)  # 进行拆包
fun(1,2,3,4)

运行结果如下:


1
(2, 3, 4)
2 3 4

在函数定义中,*args用于接收传入的多余位置参数,这些参数会被封装成一个元组赋值给args变量。

在函数内部,args本身是一个元组对象;而*args(带星号)的作用是将该元组进行解包,使其元素以独立形式呈现,这通常出现在函数调用传参的场景中。

**kwargs关键字参数详解

关于关键字参数**kwargs的工作原理:


def fun(**kwargs):
  print(kwargs)    # 未拆包
  print(*kwargs) # 进行拆包
fun(a=1, b=2)

运行结果如下:


{'a': 1, 'b': 2}
a b

*args用于接收多余的未命名参数,而**kwargs专门用于接收命名参数。

装包的核心意义在于将未命名的位置参数和命名的关键字参数分别收集到元组或字典结构中,以便统一处理。

参数解包机制与字典处理

关于参数解包的操作:

前文介绍了args和kwargs的装包功能,而实现解包的关键符号是*和**。

解包的意义在于将传递给函数的一个列表、元组或字典,拆解为独立的多个元素,并依次赋值给函数定义中的各个参变量。

对于字典的解包存在两种情况:仅使用*解包时,只能获取字典的键(key);使用**解包时,可以同时获取键和值(key, value)。需要注意的是,**解包语法在函数定义时具有特定限制,通常用于接收关键字参数。


def fun(*args, **kwargs):
  for arg in args:
    print(arg)
  for k, v in kwargs.items():
    print(k, v)
  print('-'*50)
fun(a, c)  # 参数都赋值给args,并没有kwargs的参数
fun(*a, *c)   # 解压的参数都赋值给args 等价为 1, 2, 3, 'a', 'b', 'c'
fun(*a, **c)  # a解压给args,c解压给kwargs 等价为 1, 2, 3, 'a'=1, 'b'=2, 'c'=3

运行结果如下:


[1, 2, 3]
{'a': 1, 'b': 2, 'c': 3}
--------------------------------------------------
1
2
3
a
b
c
--------------------------------------------------
1
2
3
a 1
b 2
c 3

参数传递规则与注意事项

常见问题与注意事项:

在定义函数并传入参数时,可变参数*之前的位置不能指定关键字参数名。


def myfun(a, *b):
  print(a)
  print(b)
myfun(a=1,2,3,4)


  myfun(a=1,2,3,4)
       ^
SyntaxError: positional argument follows keyword argument

当函数传入实参时,位于可变参数*之后的参数必须显式指定参数名,否则这些参数会被错误地归入可变参数列表中。


def myfun(a, *b, c=None):
  print(a)
  print(b)
  print(c)
myfun(1,2,3,c=4)

1
(2, 3)
4

如果一个函数希望某些参数必须通过关键字指定,可以将这些参数全部放置在可变参数*之后,强制调用者使用关键字传参。


def myfun(*, a, b):
  print(a)
  print(b)
myfun(a=1, b=2)

关键字参数通常只能作为函数的最后部分出现,其前面的参数既可以按位置赋值,也可以按名称赋值,顺序相对灵活。


def myfun(a, *b, c, **d):
  print(a)
  print(b)
  print(c)
  print(d)
myfun(1, 2, w=6, c=3, d=4, e=5)   # 记住可变参数(*)之前不能指定参数名

1
(2,)
3
{'w': 6, 'd': 4, 'e': 5}

以上内容是对Python中装包与解包机制的详细实例解析,旨在为读者提供清晰的参考。希望这些信息能帮助大家更好地掌握Python函数传参技巧,也欢迎继续支持本站获取更多技术内容。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。