5

对于 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”获取了多个值

为什么是这样?

4

1 回答 1

9

无论指定它们的顺序如何,位置参数都会在关键字参数之前分配。在您的情况下,位置参数是(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'
于 2010-06-29T13:41:05.800 回答