Python
*在python函数参数里的作用
发布于 2026年8月21日
* 在函数参数里主要有这几种用法:
*args(可变位置参数)- 用于接收任意数量的“位置参数”。
- 示例:
def f(a, *args): ...
调用f(1, 2, 3, 4)时,args == (2, 3, 4)。 - 这种用法*args 必须在“普通位置参数”之后,放在位置参数列表的末尾。但它之后还可以继续写 c=... 之类的关键字参数,或者 **kwargs。例如:
def f(a, b, *args, c=0, **kwargs):
...
所以它是“位置参数区段的最后一个参数收集器”,不是函数参数列表的绝对最后一个。
-
*作为分隔符(强制后面的参数只能按关键字传)- 示例:
def f(a, *, b, c=None): ... - 调用
f(1, b=2)合法,f(1, 2)不合法(b、c必须用关键字)。
- 示例:
-
/(和*常配合,虽然不是*本体,但一起看)/之前的是“仅位置参数”;*之后是“仅关键字参数”。- 示例:
def f(x, /, *, y): ...
-
调用时的
*解包- 把可迭代对象展开成位置参数传入。
- 示例:
def f(a, b, c): ...; f(*[1,2,3])
补充:**kwargs(两个星号)用于接收任意关键字参数,通常和 *args 一起出现。
* 在 Python 里不仅用于函数参数,常见用途还有:
- 乘法 / 重复
- 数值相乘:
2 * 3 - 序列重复:
[0] * 3、"a" * 4
- 可变位置参数(函数定义)
def f(*args): ...收集所有额外位置参数成元组
- 关键字-only 分隔符(函数定义)
def f(a, *, b): ...
这里*本身不是参数名,而是“后面只能用关键字传参”的分隔符
- 解包传参(函数调用)
def f(a, b, c): ...f(*[1, 2, 3])等价于f(1, 2, 3)
- 解包赋值
a, *rest = [1, 2, 3, 4],rest得到[2,3,4]- 在列表/集合中也可:
[*a, *b]
- 导入全部符号
from module import *(不推荐,容易污染命名空间)
- 异常分组处理(3.11+)
except* SomeError:用于ExceptionGroup的匹配(这是*与except的一种语法)
- 模式匹配中的解包(3.10+)
case [first, *rest]:用来捕获序列剩余元素
补充:
- 你会经常一起看到
**:它是“解包/收集关键字参数”或“字典解包”(**kwargs、{**d1, **d2})。