我们知道在list中,有+、+=、和extend,但是它这3个的区别你知道么?
+:
1 2 3 4 5 6 7
| a = [1,2 ,3] c = a + [5,6,7] print(c)
# 输出结果: [1, 2, 3, 5, 6, 7]
|
+=:
1 2 3 4 5 6 7
| a = [1,2 ,3] a += [5,6,7] print(a)
# 输出结果: [1, 2, 3, 5, 6, 7]
|
你肯定会说这个没啥好说的,那么我们修改一下,将这个列表 [5,6,7]修改为元组(5,6,7),然后我们再分别使用+和+=试试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # 使用+操作 a = [1,2 ,3] c = a + (5,6,7) print(a)
# 输出结果: TypeError: can only concatenate list (not "tuple") to list
# 使用+=操作 a = [1,2 ,3] a += (5,6,7) print(a)
# 输出结果: [1, 2, 3, 5, 6, 7]
|
所以看到没,我们这个+=可以连接不同类型的数据类型,知道为什么么,因为它里面包含了一个魔法函数__iadd__()
,通过源码我们发现里面包含了我们的extend:
1 2 3 4 5
| _collection_abc.py
def __iadd__(self, values): self.extend(values) return self
|
我们再来看一下我们的extend方法,只要是iterable就可以放在里面,前面也说过我们的序列类型都是支持可迭代的:
1 2 3 4 5
| def extend(self, values): 'S.extend(iterable) -- extend sequence by appending elements from the iterable' for v in values: self.append(v)
|
所以我们现在来看一下这个extend的用法:
1 2 3 4 5 6 7
| a = [1,2 ,3] a.extend(range(3)) print(a)
# 输出结果: [1, 2, 3, 0, 1, 2]
|
有很多人喜欢赋值对象,我们也来看看:
1 2 3 4 5 6 7
| a = [1,2 ,3] b = a.extend(range(3))
print(b)
# 输出结果: None
|
所以你注意到没有,我们这里的extend是直接对这个a对象进行操作的,然后就临时存在了内存里面,你这是去引用是找不到的,注意一下这个地方。现在就有人想起了list的append()方法,行这里我们也来试一试:
1 2 3 4 5 6
| a = [1,2 ,3] a.append(range(3)) print(a)
# 输出结果: [1, 2, 3, range(0, 3)]
|
我们还是来对比一下它们的源码吧:
1 2 3 4 5 6 7 8 9
| def extend(self, values): 'S.extend(iterable) -- extend sequence by appending elements from the iterable' for v in values: self.append(v)
def append(self, value): 'S.append(value) -- append value to the end of the sequence' self.insert(len(self), value)
|
看到没有append插入的只是一个值而已,而我们的extend却是一个可迭代对象。