Python的序列类型中,只有可变序列可以添加元素。这里以列表为例。
a = [1, 2, 3]
使用 +
情况:
a + [4,5]
> [1, 2, 3, 4, 5]
b = a + [4,5]
b
> [1, 2, 3, 4, 5]
a
> [1, 2, 3]
使用 +=
情况:
a += [6,7]
a
>[1, 2, 3, 6, 7]
从代码中,可以看到使用
+
是会返回一个值的 ,然后赋值给了 b 。而+=
不会返回值,既是说是直接在a的身上添加了元素,所以+=
后,a的元素就是[1,2,3,4,5]
了。而使用+
后,a还是原本的值。还有一个很重要的区别,就是
+
后面只能跟与a同类型
的元素,这里a是一个列表,所以只能加上同为列表元素。而+=
后面只要是可迭代对象
就可以了。
a + (8,9)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-31-20fd0af32564> in <module>()
----> 1 a + (8,9)
TypeError: can only concatenate list (not "tuple") to list
a += (8,9)
a
[1, 2, 3, 6, 7, 8, 9]
a += range(3)
a
[1, 2, 3, 6, 7, 8, 9, 0, 1, 2, 0, 1, 2]
所以如果我们定义一个可迭代对象,也是可以使用 +=
来使用的。
class Animal:
def __init__(self, animal_list):
self.animal = animal_list
def __getitem__(self, item):
return self.animal[item]
animal = Animal(['dog', 'pig', 'cat'])
这里定义了一个可迭代的对象 animal
。
a += animal
a
> [1, 2, 3, 6, 7, 8, 9, 0, 1, 2, 0, 1, 2, 'dog', 'pig', 'cat']
使用 extend()
情况:与使用+=
的情况类似,也是在对象的身上直接添加元素,而且也只要满足是可迭代对象
即可。
b = [1,2]
b.extend((3,4))
b
> [1, 2, 3, 4]
b.extend(animal)
b
> [1, 2, 3, 4, 'dog', 'pig', 'cat']
而使用 append()
虽然也是在元素本身添加元素,但有点不一样:
c = [1,2]
c.append([3,4])
c
> [1, 2, [3, 4]]
c.append((5,6))
c
> [1, 2, [3, 4], (5, 6)]
c.append(animal)
c
> [1, 2, [3, 4], (5, 6), <__main__.Animal at 0x1e8bb265c50>]
append()
是直接将参数当作一个元素添加进入了,既是参数是一个可迭代对象。
- 其实
+=
,extend()
和append()
三种方法存在着调用关系。+=
会让解释器调用__iadd__()
魔法方法,而__iadd__()
会调用extend()
方法,即a.extend(iterable)
,而extend()
方法中存在for...in...
来迭代可迭代对象,将迭代出的元素放进append()
中:
a = [1, 2]
a += (4,5)
||
a.__iadd__((4,5))
||
def extend(iterable):
for iter im iterable:
a.append(iter)