Jan*_*ora 5 python args optional-arguments python-3.x
def f(a, b, *args):
return (a, b, args)
f(a=3, b=5)
(3, 5, ())
Run Code Online (Sandbox Code Playgroud)
然而:
f(a=3, b=5, *[1,2,3])
TypeError: got multiple values for argument 'b'
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
任何特殊原因?
如果语法
*expression
出现在函数调用中,则表达式必须求值为iterable.来自这些迭代的元素被视为它们是附加的位置参数.对于调用f(x1, x2, *y, x3, x4)
,如果y
求值为序列y1, ..., yM
,则这相当于具有M+4
位置参数的调用x1, x2, y1, ..., yM, x3, x4
.
然后,接下来是:
这样做的结果是虽然
*expression
语法可能出现在显式关键字参数之后,但它在关键字参数之前处理(以及任何**expression arguments
- 参见下文).
(强调我的)
因此,Python将首先处理*args
作为位置参数,为其赋值b
并重新赋值,b=5
从而导致具有多个值的关键字参数出错.