Python中a += b 並不必定等價於a = a + b

你們常常在一些博客中看到這樣的說法: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 += ba = a + b並非徹底等價的。ui

實際上,這是因爲+=會首先調用左邊這個對象的__iadd__方法,若是沒有__iadd__方法,就會調用__add__方法。可是若是直接使用+號,就會直接調用__add__方法。而對於字符串、數字、浮點數這種不可變對象,他們沒有__iadd__方法,因此對他們來講,a += ba = 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]
複製代碼
相關文章
相關標籤/搜索