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 a
和 b
的 7
,因此 23
将分配给参数 c
,这就是 fun(3, 7, d=10, *(23,))
有效的原因,但在 fun(3, 7, c=10, *(23,))
中你也是将值 10
分配给 c
作为关键字参数,因此它被认为是冲突,因为 c
不能同时分配给 23
和 10
。
请注意,虽然语法是合法的,但某些人不鼓励在关键字参数之后解包可迭代参数,如所讨论的那样here,尽管语法最终被裁定保留。
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 a
和 b
的 7
,因此 23
将分配给参数 c
,这就是 fun(3, 7, d=10, *(23,))
有效的原因,但在 fun(3, 7, c=10, *(23,))
中你也是将值 10
分配给 c
作为关键字参数,因此它被认为是冲突,因为 c
不能同时分配给 23
和 10
。
请注意,虽然语法是合法的,但某些人不鼓励在关键字参数之后解包可迭代参数,如所讨论的那样here,尽管语法最终被裁定保留。