You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python函数定义中参数列表中间`*`的作用是什么?

Python函数参数列表中*的作用解析

一、参数列表中间的*的作用

没错,它就是用来显式分隔位置参数和关键字参数的:

  • *前面的参数(比如这里的x、y)只能通过位置传递,调用时需按顺序传值;
  • *后面的参数(比如这里的z、w)必须通过关键字参数传递,调用时必须写成z=xxx、w=xxx的形式,不能直接传位置值。

举个实际调用的例子:

def f(x,y, *, z, w, **kwargs):
    print(x,y,z,w,kwargs)

# 合法调用
f(1, 2, z=3, w=4, extra=6)  # 输出:1 2 3 4 {'extra': 6}
# 非法调用,直接传位置值给z、w会报错
# f(1,2,3,4)  # 抛出 TypeError: f() takes 2 positional arguments but 4 were given

二、移除*后的行为变化

把*去掉写成f(x,y,z,w,**kwargs),函数的调用规则会完全改变:

  • z、w不再是强制关键字参数,变成了位置/关键字双兼容的参数——你可以按位置传值,也可以用关键字传值;
  • 调用时的参数灵活性变高,但也容易出现参数传递的歧义。比如:
def f(x,y,z,w,**kwargs):
    print(x,y,z,w,kwargs)

# 以下调用全部合法
f(1,2,3,4)  # 输出:1 2 3 4 {}
f(1,2,z=3,w=4)  # 输出:1 2 3 4 {}
f(1,2,3,w=4, extra=5)  # 输出:1 2 3 4 {'extra': 5}
# 但多传位置参数会报错
# f(1,2,3,4,5)  # 抛出 TypeError: f() takes 4 positional arguments but 5 were given

另外,原来带*的版本中,**kwargs只会接收z、w之外的关键字参数;移除*后,**kwargs同样接收额外的关键字参数,但位置参数的数量限制从2个变成了4个。

内容的提问来源于stack exchange,提问作者thmo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:58:19