浏览知识库目录

Python

*在python函数参数里的作用

* 在函数参数里主要有这几种用法:

  1. *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):
    ...

所以它是“位置参数区段的最后一个参数收集器”,不是函数参数列表的绝对最后一个。

  1. * 作为分隔符(强制后面的参数只能按关键字传)

    • 示例:def f(a, *, b, c=None): ...
    • 调用 f(1, b=2) 合法,f(1, 2) 不合法(bc 必须用关键字)。
  2. /(和 * 常配合,虽然不是 * 本体,但一起看)

    • / 之前的是“仅位置参数”;* 之后是“仅关键字参数”。
    • 示例:def f(x, /, *, y): ...
  3. 调用时的 * 解包

    • 把可迭代对象展开成位置参数传入。
    • 示例:def f(a, b, c): ...; f(*[1,2,3])

补充:**kwargs(两个星号)用于接收任意关键字参数,通常和 *args 一起出现。

* 在 Python 里不仅用于函数参数,常见用途还有:

  1. 乘法 / 重复
  • 数值相乘:2 * 3
  • 序列重复:[0] * 3"a" * 4
  1. 可变位置参数(函数定义)
  • def f(*args): ... 收集所有额外位置参数成元组
  1. 关键字-only 分隔符(函数定义)
  • def f(a, *, b): ...
    这里 * 本身不是参数名,而是“后面只能用关键字传参”的分隔符
  1. 解包传参(函数调用)
  • def f(a, b, c): ...
  • f(*[1, 2, 3]) 等价于 f(1, 2, 3)
  1. 解包赋值
  • a, *rest = [1, 2, 3, 4]rest 得到 [2,3,4]
  • 在列表/集合中也可:[*a, *b]
  1. 导入全部符号
  • from module import *(不推荐,容易污染命名空间)
  1. 异常分组处理(3.11+)
  • except* SomeError: 用于 ExceptionGroup 的匹配(这是 *except 的一种语法)
  1. 模式匹配中的解包(3.10+)
  • case [first, *rest]: 用来捕获序列剩余元素

补充:

  • 你会经常一起看到 **:它是“解包/收集关键字参数”或“字典解包”(**kwargs{**d1, **d2})。