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

[list]的.append 和.extend,哪个是操作列表添加元素的 perferabley only one way?

  •  
  •   northisland · 2018-04-13 09:28:52 +08:00 · 2900 次点击
    这是一个创建于 2452 天前的主题,其中的信息可能已经有所发展或是发生改变。

    append

    list_obj.append("one_more_datum")
    

    extend

    list_obj += ["one_more_datum"]
    
    • 复杂度,append 更好
    • 可读性,extend 更好(少打字)

    请问你们平时用哪个?

    22 条回复    2018-04-13 21:16:47 +08:00
    TuringGunner
        1
    TuringGunner  
       2018-04-13 09:32:51 +08:00 via iPhone
    什么?单个元素还有人写第二种?
    justou
        2
    justou  
       2018-04-13 09:34:34 +08:00   ❤️ 1
    少打字≠可读性好
    huhujin
        3
    huhujin  
       2018-04-13 09:40:32 +08:00
    主要看代码逻辑,两个都可以.此外 += 调用__iadd__ 方法,后面只要是可迭代对象就好
    crb912
        4
    crb912  
       2018-04-13 09:40:56 +08:00 via Android
    难了。楼主你连 extend 和+连接符没区分开。加号连接符是加号连接符,extend 是列表的方法。这是两个不同的东西。
    append 只能追加单个元素,
    extend 会在原先的列表 A 尾部扩展新的列表 B 的全部元素上去。这个时候,A 被更新了。
    +连接符只是连接操作,不会修改,等价于得到一个副本。
    crb912
        5
    crb912  
       2018-04-13 09:45:31 +08:00 via Android
    你的第二行代码就不是 extend 方法。你用加号连接符生成了副本,然后赋值给了 list_obj。。。。这个对内存的的开销更大。一种不优雅的方式。

    A.extend[B]
    休息 B 必须是列表对象,而非元素
    gonethen
        6
    gonethen  
       2018-04-13 09:46:40 +08:00   ❤️ 1
    我主观上觉得 append 可读性好
    julyclyde
        7
    julyclyde  
       2018-04-13 10:14:20 +08:00
    从语义上讲,你添加的是元素,而不是另一个 list
    noNOno
        8
    noNOno  
       2018-04-13 10:17:54 +08:00
    虽然不想挑毛病,但是+=的可读性就很不好
    goodryb
        9
    goodryb  
       2018-04-13 10:28:28 +08:00
    标题与内容不符?
    明明说的的 append 和 extend,结果举得例子是 append 和+

    append 是添加单个元素
    extend 是追加一个列表

    分不清"one_more_datum" 和 ["one_more_datum"]的区别吗?

    如果是"one_more_datum" 和 ["one_more_datum","another_more_datum"] 就不会犹豫说用哪种方法了吧
    Sylv
        10
    Sylv  
       2018-04-13 10:28:42 +08:00 via iPhone
    显然 append 比 += 更直观,append 一看就知道是在末尾附加的操作,+= 还要想一下。
    deepjia
        11
    deepjia  
       2018-04-13 11:38:57 +08:00
    这不是 extend
    lrxiao
        12
    lrxiao  
       2018-04-13 12:08:19 +08:00   ❤️ 1
    我就吐槽下标题
    perferabley => preferably
    ericls
        13
    ericls  
       2018-04-13 12:13:37 +08:00 via iPhone
    第二个不是 extend 第二个甚至会有复制
    ericls
        14
    ericls  
       2018-04-13 12:14:12 +08:00 via iPhone
    ^^ * extend 甚至有复制
    laoyur
        15
    laoyur  
       2018-04-13 12:17:04 +08:00   ❤️ 1
    哈哈,总结下槽点:
    1. perferabley => preferably
    2. 标题说的是 append 和 extend,然后正文用的是 append 和+,显然楼主误解了 extend 和+的关系
    3. 楼主对 append 和 extend (其实这里是+)的可读性比较似乎有什么误解
    4. 楼主怼「可读性」和「少打字」之间的理解似乎有什么误解
    xpresslink
        16
    xpresslink  
       2018-04-13 13:26:41 +08:00
    @laoyur
    += 调用对象的__iadd__方法。
    对于 list 对象
    a += b

    a.extand(b)
    是完全等效的。
    northisland
        17
    northisland  
    OP
       2018-04-13 13:41:19 +08:00
    @lrxiao
    @laoyur

    楼主是跟山东人学的英语,口音比较重,
    见谅
    ironx
        18
    ironx  
       2018-04-13 13:50:48 +08:00 via Android
    这是两个不同的方法。一个是添加单个元素 1,返回原先列表的引用。一个是连接两个列表,返回新列表的引用。
    myyou
        19
    myyou  
       2018-04-13 13:58:43 +08:00
    @xpresslink extend 是迭代 append,+是两个对象相加生成新对象
    chenstack
        20
    chenstack  
       2018-04-13 14:20:56 +08:00   ❤️ 2
    @myyou @crb912
    本来是讨论 append 和 extend,结果有些人讨论的是+=操作符是不是 extend 了。
    += 会优先看有没有__iadd__方法,对于 list,是有的。在这个情况下 a += b 和 a = a + b 不是等价的。如 xpresslink 所说,
    list 的+=和 extend 几乎是等价的,如果还纠结+操作符,不如做个试验
    a = [1, 2]
    print(id(a))
    a += [3]
    print(id(a))
    a = a + [4]
    print(id(a))

    对于楼主的问题,如果只有一个元素添加,我选 appand,语义上更符合,而且没有创建 list 的开销
    wizardforcel
        21
    wizardforcel  
       2018-04-13 20:08:04 +08:00 via Android
    @crb912 += 不会修改???你说啥??再说一遍??
    crb912
        22
    crb912  
       2018-04-13 21:16:47 +08:00 via Android
    @chenstack 看来我完全不知道 a += b 和 a = a + b 在 list 的区别。多谢指点
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2862 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:33 · PVG 21:33 · LAX 05:33 · JFK 08:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.