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
lixia625
V2EX  ›  Python

请问这样的用法要怎么理解

  •  
  •   lixia625 · 2016-08-24 17:59:58 +08:00 · 2538 次点击
    这是一个创建于 3017 天前的主题,其中的信息可能已经有所发展或是发生改变。
    >>> a=()
    >>> a
    ()
    >>> a+=1,
    >>> a
    (1,)
    >>> a=[]
    >>> a+=1,
    >>> a
    [1]
    
    12 条回复    2016-08-25 12:21:53 +08:00
    sinux
        1
    sinux  
       2016-08-24 18:06:28 +08:00
    这样理解:“这么写根本就是错的”。
    wlsnx
        2
    wlsnx  
       2016-08-24 18:09:25 +08:00   ❤️ 1
    论括号的重要性

    >>> a=()
    >>> a
    ()
    >>> a+=(1,)
    >>> a
    (1,)
    >>> a=[]
    >>> a+=[1,]
    >>> a
    [1]
    lixia625
        3
    lixia625  
    OP
       2016-08-24 18:09:46 +08:00
    @sinux
    然而没有报错
    lixia625
        4
    lixia625  
    OP
       2016-08-24 18:10:26 +08:00
    @wlsnx
    卡尔王 请问凭啥这么加括号
    sinux
        5
    sinux  
       2016-08-24 18:12:09 +08:00
    @lixia625 因为省略括号的逗号就会被解释器认为 tuple
    lixia625
        6
    lixia625  
    OP
       2016-08-24 18:12:48 +08:00
    @sinux 那 list 怎么解释
    wlsnx
        7
    wlsnx  
       2016-08-24 18:13:37 +08:00
    @lixia625
    本来就是要加括号的,被省略了而已
    另一个例子是 return 1,2,3 => return (1,2,3)
    我的建议是该加的括号要加,很关键
    sinux
        8
    sinux  
       2016-08-24 18:14:46 +08:00
    @lixia625 不懂了,等指教。
    lixia625
        9
    lixia625  
    OP
       2016-08-24 18:15:53 +08:00
    @wlsnx 好吧 python 黑魔法
    sinux
        10
    sinux  
       2016-08-24 18:33:16 +08:00
    @wlsnx @lixia625

    噢,搞清楚了,这和省不省略括号没关系
    省略了括号的 1, 永远都会是 tuple
    问题的根源在于 +=
    list += 会被解释为 list.extend()
    这个方法接受一切可迭代对象, tuple 自然也是,所以 list.extend((1,2)) 也是成功的咯

    然后你莫名其妙的用一个 list 直接加上一个 tuple 还是会告诉你报错的。
    TypeError: can only concatenate list (not "tuple") to list

    参考:
    http://stackoverflow.com/questions/13332987/list-tuple-vs-list-list-tuple
    jugelizi
        11
    jugelizi  
       2016-08-24 18:44:36 +08:00
    两个 tuple 连接也没啥问题啊
    wizardforcel
        12
    wizardforcel  
       2016-08-25 12:21:52 +08:00   ❤️ 1
    tuple 的 += 调用 __add__,而 list 的 += 调用 __iadd__。

    前面那个只接受 tuple ,后面那个接受 iterable 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5419 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 08:27 · PVG 16:27 · LAX 00:27 · JFK 03:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.