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
相关产品推荐
相关产品推荐

