Python中列表的.append和.extend方法,哪个是添加元素的唯一推荐方式?

append

list_obj.append("one_more_datum")

extend

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

请问你们平时用哪个?


Python中列表的.append和.extend方法,哪个是添加元素的唯一推荐方式?

23 回复

什么?单个元素还有人写第二种?


这问题问得有点绝对了。.append().extend() 是干两件完全不同事情的,没有哪个是“唯一推荐”的,完全看你要干嘛。

简单说:

  • .append(x):把 x 这个整个对象塞到列表末尾。x 是什么就原样放进去。如果你 append 一个列表,那列表就成了列表里的一个元素(嵌套列表)。
  • .extend(iterable):把 iterable(比如另一个列表、元组、字符串)里的每个元素挨个拿出来,加到列表末尾。它是在“扩展”原列表。

看代码最直接:

# 例子1:添加单个元素
my_list = [1, 2, 3]
my_list.append(4)        # 把数字4加进去
print(my_list)          # 输出: [1, 2, 3, 4]

my_list.append([5, 6])  # 把整个列表 [5, 6] 作为一个元素加进去
print(my_list)          # 输出: [1, 2, 3, 4, [5, 6]]

# 例子2:合并另一个列表的所有元素
my_list = [1, 2, 3]
my_list.extend([4, 5])  # 把列表 [4, 5] 里的 4 和 5 拆出来加进去
print(my_list)          # 输出: [1, 2, 3, 4, 5]

my_list.extend("ab")    # 字符串也是可迭代的,拆出 'a', 'b'
print(my_list)          # 输出: [1, 2, 3, 4, 5, 'a', 'b']

总结:想加单个东西用 append,想合并一堆东西用 extend

少打字≠可读性好

主要看代码逻辑,两个都可以.此外 += 调用__iadd__ 方法,后面只要是可迭代对象就好

难了。楼主你连 extend 和+连接符没区分开。加号连接符是加号连接符,extend 是列表的方法。这是两个不同的东西。
append 只能追加单个元素,
extend 会在原先的列表 A 尾部扩展新的列表 B 的全部元素上去。这个时候,A 被更新了。
+连接符只是连接操作,不会修改,等价于得到一个副本。

你的第二行代码就不是 extend 方法。你用加号连接符生成了副本,然后赋值给了 list_obj。。。。这个对内存的的开销更大。一种不优雅的方式。

A.extend[B]
休息 B 必须是列表对象,而非元素

我主观上觉得 append 可读性好

从语义上讲,你添加的是元素,而不是另一个 list

虽然不想挑毛病,但是+=的可读性就很不好

标题与内容不符?
明明说的的 append 和 extend,结果举得例子是 append 和+

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

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

如果是"one_more_datum" 和 [“one_more_datum”,“another_more_datum”] 就不会犹豫说用哪种方法了吧

显然 append 比 += 更直观,append 一看就知道是在末尾附加的操作,+= 还要想一下。

这不是 extend

我就吐槽下标题
perferabley => preferably

第二个不是 extend 第二个甚至会有复制

^^ * extend 甚至有复制

哈哈,总结下槽点:
1. perferabley => preferably
2. 标题说的是 append 和 extend,然后正文用的是 append 和+,显然楼主误解了 extend 和+的关系
3. 楼主对 append 和 extend (其实这里是+)的可读性比较似乎有什么误解
4. 楼主怼「可读性」和「少打字」之间的理解似乎有什么误解


+= 调用对象的__iadd__方法。
对于 list 对象
a += b

a.extand(b)
是完全等效的。




楼主是跟山东人学的英语,口音比较重,
见谅

这是两个不同的方法。一个是添加单个元素 1,返回原先列表的引用。一个是连接两个列表,返回新列表的引用。

extend 是迭代 append,+是两个对象相加生成新对象


本来是讨论 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 的开销

+= 不会修改???你说啥??再说一遍??

看来我完全不知道 a += b 和 a = a + b 在 list 的区别。多谢指点

回到顶部