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赋值"秘密地"做要好,因为"显式比隐式好"。