Python 函数参数中的 * 号

📅 2026/6/30 23:03:03
Python 函数参数中的 * 号
在 Python 函数定义中*号主要有两种含义取决于它出现的位置。一、*的两种用法位置含义作用在形参中接收任意数量的位置参数def func(*args)在参数列表中间分隔符强制后面的参数必须用关键字传递二、*作为分隔符强制关键字参数在函数定义中*之后的所有参数在调用时必须使用参数名值的形式传递不能只传值。示例def example(a, b, *, c, d): print(a, b, c, d) # 正确c 和 d 用了关键字 example(1, 2, c3, d4) # 错误c 和 d 只传值会被识别为位置参数 example(1, 2, 3, 4) # TypeError: example() takes 2 positional arguments but 4 were given三、代码示例async def ainvoke( self, input: InputT | Command | None, config: RunnableConfig | None None, *, # ← 分隔符 context: ContextT | None None, stream_mode: StreamMode values, ... ) - dict[str, Any] | Any:备注config之前的参数可以用位置传也可以用关键字传context及之后的参数必须用关键字传#正确 await ainvoke( input_data, configmy_config, contextmy_context, stream_modeupdates ) #错误context 后面的参数没带名字 await ainvoke( input_data, my_config, my_context, # ← 没带参数名会报错 updates )四、其他常见用法1.*args接收任意位置参数def func(*args): print(args) func(1, 2, 3) # (1, 2, 3)2.**kwargs接收任意关键字参数def func(**kwargs): print(kwargs) func(a1, b2) # {a: 1, b: 2}3. 三者结合def func(a, b1, *args, c2, **kwargs): pass # a → 位置参数 # b1 → 默认参数 # *args → 可变位置参数 # c2 → 关键字参数必须用关键字传 # **kwargs → 可变关键字参数五、总结写法含义*args收集多余的位置参数存为元组**kwargs收集多余的关键字参数存为字典*单独出现分隔符后面的参数必须用关键字传递*,后面紧跟参数强制关键字参数Keyword-Only Arguments