你們常常在一些博客中看到這樣的說法:python
a += 1
複製代碼
等價於git
a = a + 1
複製代碼
這種說法實際上並不許確。github
咱們來看一個例子:bash
>>> a = [1, 2, 3]
>>> a += (4,)
>>> a
[1, 2, 3, 4]
>>> a = [1, 2, 3]
>>> a = a + (4,)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list
複製代碼
這裏報錯了,說明a += b
和a = a + b
並非徹底等價的。ui
實際上,這是因爲+=
會首先調用左邊這個對象的__iadd__
方法,若是沒有__iadd__
方法,就會調用__add__
方法。可是若是直接使用+
號,就會直接調用__add__
方法。而對於字符串、數字、浮點數這種不可變對象,他們沒有__iadd__
方法,因此對他們來講,a += b
與 a = a + b
是等價的。spa
可是列表是一個可變的容器,它內部是有__iadd__
這個方法。對於列表來講,它的__iadd__
方法的原型以下:code
def __iadd__(self, values):
self.extend(values)
return self
複製代碼
這一段代碼你能夠在這裏看到:github.com/python/cpyt…對象
因此說,當你使用+=
鏈接列表和元組的時候,本質上是列表使用extend
把元組的內容添加進去。這樣是不會報錯的:字符串
>>> a = [1, 2, 3]
>>> a.extend((4,))
>>> a
[1, 2, 3, 4]
複製代碼