python函数调用中不同形式的赋值的顺序是什么?

python函数调用中不同形式的赋值的顺序是什么?,python,Python,当我运行下面的代码时,我得到一个错误,为什么?争论的顺序不正确吗 def f(a, b, c, d): print a, b, c, d f(1, b=2, *(3,), **{'d': 4}) 这是我得到的错误: Traceback (most recent call last): File "/home/asad/scripts/l.py", line 9, in <module> f(1, b=2, *(3,), **{'d': 4}) TypeErro

当我运行下面的代码时,我得到一个错误,为什么?争论的顺序不正确吗

def f(a, b, c, d):
    print a, b, c, d

f(1, b=2, *(3,), **{'d': 4})
这是我得到的错误:

Traceback (most recent call last):
  File "/home/asad/scripts/l.py", line 9, in <module>
    f(1, b=2, *(3,), **{'d': 4})
TypeError: f() got multiple values for keyword argument 'b'
[Finished in 0.1s with exit code 1]
回溯(最近一次呼叫最后一次):
文件“/home/asad/scripts/l.py”,第9行,在
f(1,b=2,*(3,),***{'d':4})
TypeError:f()为关键字参数“b”获取了多个值
[在0.1s内完成,退出代码为1]

这会起作用-注意事物的呈现顺序

 f(1, *(2,), c=3, **{'d': 4})

函数调用中的
b=2
不是变量赋值,而是传递关键字参数

您正在将
b
作为关键字参数传递,但同时也在传递值
3
(作为第二个位置参数),该值也是
b


因此,
b
在该函数调用中接收到多个值。

您将
b
指定为位置参数和关键字参数

定义见:

位置参数:不是关键字参数的参数。位置参数可以出现在参数列表的开头,和/或作为前面带有*的iterable元素传递

关键字参数:在函数调用中以标识符(如name=)开头的参数,或在字典中以值的形式传递,前面加**

位置参数始终按顺序分配。所以当你这样做的时候:

>>> f(1, b=2, *(3,), **{'d': 4})   # Same as f(1, b=2, 3, d=4)
两个位置参数
1
3
分别分配给
a
b
。当您还将其指定为关键字参数(
b=2
)时,
b
因此会指定多个值

一些限制

如果需要有关如何定义调用的更多信息,请参阅。值得注意的是,
*expression
后面只能跟关键字参数,
**expression
必须是调用中的最后一个参数

解决方案

重新排列参数,使位置参数始终列在第一位:

>>> f(1, *(2,), c=3, **{'d': 4})   # Same as f(1, 2, c=3, d=4)

你能告诉我们你得到了什么错误吗?因为位置参数必须在关键字参数之前传递。但是*形式不应该在关键字参数之后吗?@asad不,它不应该。在代码中,b的值是3和2。如果你改变你的论点的顺序,它会更清楚。为什么这被否决?它是100%正确的,并且说明了这个问题。你可能会指出,
f(1,c=3,*(2,),***{'d':4})
同样有效,但他的尝试失败了,强调关键字参数不同于位置参数。为什么要将3作为第二个位置参数传入?我以为它会作为第三个参数传入。@asad:位置参数首先传入,然后是关键字参数。因此这是第二个位置参数。你能解释一下为什么这不起作用吗:f(1,*(2,),***{c':3},d=4)