Python函数万能参数(*args, **kwargs)传参详解与常见误区

Mia
Mia
发布时间:2026-10-13 | 5人浏览过
原创

本文详细解析Python中*args和**kwargs作为万能参数的传参机制。通过对比直接传递列表/字典与解包传递的区别,阐明位置参数与关键字参数的绑定规则。重点分析使用**解包字典时键名与形参名不匹配导致的默认值覆盖问题,帮助开发者避免常见传参错误。

Python万能参数基础示例

为了直观展示Python函数中万能参数的行为,我们先构建一个最基础的函数示例。


def test(*args,**kwargs):
print(args,kwargs)

接着,定义两个测试变量,分别是一个列表和一个字典。


l = [1,2,3,4]
d = {"a":1,"b":2}

两种传参方式对比

随后,我们将对比两种不同的传参方式,观察它们对函数内部参数的影响。

第一种传参方式如下所示。


test(l,d)

若采用上述方式调用函数,列表l和字典d将作为两个独立的对象传递给*args形参,此时args变量包含这两个元素构成的元组;而**kwargs形参未接收任何数据,因此是一个空字典。


([1, 2, 3, 4], {'a': 1, 'b': 2}) {}

运行结果显示,列表l和字典d被打包进args元组中,成为其两个元素。

第二种传参方式涉及解包操作。


test(*l,**d)

在此种调用模式下,列表l被解包后逐个元素赋值给args,而字典d被解包后其键值对赋值给kwargs。


(1, 2, 3, 4) {'a': 1, 'b': 2}

通过上述演示,可以清晰理解Python万能参数的接收逻辑,以及在不同传参场景下如何正确调用函数。

字典解包传参常见误区解析

在实际开发中,由于对解包机制理解不深容易混淆,此处再次梳理关键概念。

请观察以下函数定义及其调用示例。


def foo(action=None,**kwargs):
  print("action",action,sep="=================>")
  print("kwargs", kwargs, sep="=================>")
 
d = {"a":1,"b":2} 
foo(d)
print("=".center(100,"*"))
 
foo(**d)

该代码的执行输出结果如下。

下面对输出结果进行详细解释。

第一种调用方式直接传递了一个字典对象。此时,该字典被视为一个整体参数,赋值给位置形参action。

第二种调用方式使用了**字典解包语法。其实际传递效果等同于逐个传递命名参数(如a=1, b=2)。由于字典中的键名并非action,因此位置形参action未接收到值,保持默认值None;而解包出的键值对则进入kwargs字典。

因此,在第二种调用中,action参数的值为None。

此时,kwargs变量包含了解包后的键值对,表现为一个字典。

接下来考察第三种调用方法。


d = {"action":"action","a":1}
foo(**d)

观察其执行结果,可以进一步验证解包传参的行为逻辑。

以上即为Python万能参数传参的核心要点,希望能为读者的编程实践提供清晰指引。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表