V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
piapia
V2EX  ›  Python

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

  •  
  •   piapia · 2015-11-04 22:27:46 +08:00 · 3059 次点击
    这是一个创建于 3337 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在学 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 里搜索过?不知道关键词不对还是怎么,没有找出相关的答案.
    5 条回复    2015-11-06 23:19:46 +08:00
    RickyBoy
        1
    RickyBoy  
       2015-11-04 23:41:46 +08:00
    位置参数必须放在关键字参数前面,参数优先级的问题
    *args 优先级高于关键字参数 a=7 ,所以导致 a 被多次赋值
    wangchen
        2
    wangchen  
       2015-11-05 00:06:58 +08:00
    顺序: func(a1, a2, *args, **kwargs), 问题:"a=7" 是 kwargs
    piapia
        3
    piapia  
    OP
       2015-11-05 15:04:18 +08:00
    @RickyBoy @wangchen 感谢,现在明白了.
    xueweihan
        4
    xueweihan  
       2015-11-06 23:18:53 +08:00 via Android
    难道这个不是默认值要放在后面的问题?
    xueweihan
        5
    xueweihan  
       2015-11-06 23:19:46 +08:00 via Android
    我什么都没说。。。我还是看书去了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1116 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:50 · PVG 02:50 · LAX 10:50 · JFK 13:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.