Python解包参数列表/ dict案例中的关键字参数


问题内容

对于python,我可以如下使用解包参数。

def hello(x, *y, **z):
    print 'x', x
    print 'y', y
    print 'z', z

hello(1, *[1,2,3], a=1,b=2,c=3)
hello(1, *(1,2,3), **{'a':1,'b':2,'c':3})



x = 1
y =(1,2,3)
z = {'a':1,'c':3,'b':2}

但是,如果我按如下方式使用关键字参数,则会出错。

hello(x=1, *(1,2,3), **{'a':1,'b':2,'c':3})



TypeError:hello()为关键字参数“ x”获得了多个值

为什么是这样?


问题答案:

无论指定顺序如何,位置参数都将在关键字参数之前分配。在您的情况下,位置参数为(1, 2, 3),关键字参数为x=1, a=1, b=2, c=3。因为首先要分配位置参数,所以参数将x收到1,并且不再适合使用关键字参数。这听起来有点奇怪,因为在语法上您的位置参数是 关键字参数
之后 指定的,但是始终遵循“位置参数→关键字参数”的顺序。

这是一个更简单的示例:

>>> def f(x): pass
... 
>>> f(1, x=2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() got multiple values for keyword argument 'x'
>>> f(x=2, *(1,))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() got multiple values for keyword argument 'x'