Python - 方法参数中的值解包顺序

Python - value unpacking order in method parameters

def fun(a, b, c, d):
    print('a:', a, 'b:', b, 'c:', c, 'd:', d)

为什么这个有效

fun(3, 7, d=10, *(23,))

并打印出来:

a: 3 b: 7 c: 23 d: 10

而这

fun(3, 7, c=10, *(23,))

没有

Traceback (most recent call last):
  File "/home/lookash/PycharmProjects/PythonLearning/learning.py", line 10, in <module>
    fun(3, 7, c=10, *(23,))
TypeError: fun() got multiple values for argument 'c'

使用 *(23,),您将元组 (23,) 中的值解包为位置参数,遵循已经定义的位置参数,即 3 for ab7,因此 23 将分配给参数 c,这就是 fun(3, 7, d=10, *(23,)) 有效的原因,但在 fun(3, 7, c=10, *(23,)) 中你也是将值 10 分配给 c 作为关键字参数,因此它被认为是冲突,因为 c 不能同时分配给 2310

请注意,虽然语法是合法的,但某些人不鼓励在关键字参数之后解包可迭代参数,如所讨论的那样here,尽管语法最终被裁定保留。