Python中解包参数列表/字典时的关键字参数

5 投票
1 回答
2336 浏览
提问于 2025-04-16 00:34

对于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() got multiple values for keyword argument 'x'

这是为什么呢?

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'

撰写回答