怎么理解"因为 python 使用次序规则来扩展过量的参数,那位置参数要放在前面。"这句话的准确意思?

2015-11-04 22:27:46 +08:00
 piapia
在学 python 的函数传递参数的时候看到这样一篇文章.
http://blog.csdn.net/qinyilang/article/details/5484415

其中有代码
>>> def add(a, b, c):
return a + b + c

>>> add(1, 2, 3)
6
>>> add(a=4, b=5, c=6)
15
>>> args = (2, 3)
>>> add(1, *args)
6
>>> kwargs={'b': 8, 'c': 9}
>>> add(a=7, **kwargs)
24
>>> add(a=7, *args)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: add() got multiple values for keyword argument 'a'
>>> add(1, 2, a=7)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: add() got multiple values for keyword argument 'a'

当这样调用 的时候 add(a=7, *args)会报错。而 add(7, *args)这样子就不会了。。
文末最后有一段话**因为 python 使用次序规则来扩展过量的参数,那位置参数要放在前面。**

是不是意思是在这里*args 会优先解包,按次序匹配,所以最后 python 不知道要把哪个值给 a 了???但是也看到一些地方说 key=value 形式的实参要优先*args 的?

python 入门者..好多概念不是很清晰.所以不是很明白了..这个地方要怎么去理解?
已在社区 google 里搜索过?不知道关键词不对还是怎么,没有找出相关的答案.
3030 次点击
所在节点    Python
5 条回复
RickyBoy
2015-11-04 23:41:46 +08:00
位置参数必须放在关键字参数前面,参数优先级的问题
*args 优先级高于关键字参数 a=7 ,所以导致 a 被多次赋值
wangchen
2015-11-05 00:06:58 +08:00
顺序: func(a1, a2, *args, **kwargs), 问题:"a=7" 是 kwargs
piapia
2015-11-05 15:04:18 +08:00
@RickyBoy @wangchen 感谢,现在明白了.
xueweihan
2015-11-06 23:18:53 +08:00
难道这个不是默认值要放在后面的问题?
xueweihan
2015-11-06 23:19:46 +08:00
我什么都没说。。。我还是看书去了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/233698

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX