Why do Python lists have an extend method?
a_list.extend(list2)做了(或做得更好)而a_list += list2没有做的是什么?
除观察到如果.extend()返回扩展列表以便您可以层叠另一个方法之外,这都是一个答案。但没有,所以你不能。
- +=是a)后来添加到语言中,b)for list是作为list.extend()调用实现的。
- 啊-没想过历史。谢谢。我是不是认为a_list = a_list + list2会导致制作一份清单的副本,所以效率相对较低?还有为什么投反对票?
- 是的,串联创建一个新的列表对象。
- 关于这两种方法的更多信息,请访问:stackoverflow.com/questions/3653298/…
- a_list = a_list + list2创建一个新的列表,并将其绑定到名称a_list上,替换原来的列表对象。Otoh,a_list[:] = a_list + list2将新列表复制回绑定到a_list名称的原始列表对象。如果其他对象包含对a_list的引用,并且您希望它们反映您对a_list所做的任何更改,这可能很有用,但是这比简单的a_list = a_list + list2慢一点。
list.extend()是一个表达式,可以嵌入更大的表达式中。+=是一个语句,语句不能嵌入表达式中。
所以你可以这样做:
1
| doubled_extender = lambda l, it: l.extend(v for v in it for _ in range(2)) |
但是你不能在那里使用+=。
注意,对于list对象,+=使用的object.__iadd__()特殊方法,在返回self之前直接调用list.extend()。
最后但并非最不重要的是,在list.extend()之后,增加了增强赋值功能。
.extend的另一个好处是,您可以将其称为全局列表,因为这只会改变列表,而+=在这种情况下不起作用,因为您不能在本地范围内分配给全局。
演示
1 2 3 4 5 6 7 8 9 10 11 12 13
| a_list = ['one']
list2 = ['two', 'three']
def f():
a_list.extend(list2)
def g():
a_list += list2
f()
print(a_list)
g()
print(a_list) |
号
输出
1 2 3 4 5 6 7
| ['one', 'two', 'three']
Traceback (most recent call last):
File"./qtest.py", line 43, in <module>
g()
File"./qtest.py", line 39, in g
a_list += list2
UnboundLocalError: local variable 'a_list' referenced before assignment |
但是,如果您也使用切片分配,那么可以使用+=,因为这也是原始列表的一个突变:
1 2 3 4 5 6 7 8
| a_list = ['one']
list2 = ['two', 'three']
def g():
a_list[:] += list2
g()
print(a_list) |
。
输出
- 当然,您总是可以将global a_list添加到函数中。
- @切普纳当然,但我尽量避免使用global关键字。当然,不管你怎么做,以任何方式改变全局都是一种可疑的做法,我想在你的函数定义中使用global关键字提醒读者这一事实,我想这比用.extend或slice赋值"秘密地"做要好,因为"显式比隐式好"。