为什么Python列表有一个extend方法?

Why do Python lists have an extend method?

本问题已经有最佳答案,请猛点这里访问。

a_list.extend(list2)做了(或做得更好)而a_list += list2没有做的是什么?

除观察到如果.extend()返回扩展列表以便您可以层叠另一个方法之外,这都是一个答案。但没有,所以你不能。


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)

输出

1
['one', 'two', 'three']