Мы часто видим это утверждение в некоторых блогах:
a += 1
Эквивалентно
a = a + 1
Это утверждение на самом деле не соответствует действительности.
Давайте посмотрим на пример:
>>> 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Не совсем эквивалентно.
На самом деле это связано с+=сначала вызовет объект слева__iadd__метод, если нет__iadd__метод, он вызовет__add__метод. Но если вы используете его напрямую+Нет, это будет напрямую позвонить__add__метод.而对于字符串、数字、浮点数这种不可变对象,他们没有__iadd__метод, поэтому для них,a += bиa = a + bэквивалентны.
Но список является изменяемым контейнером, он имеет__iadd__Сюда. Для списков это__iadd__Далее следует:
def __iadd__(self, values):
self.extend(values)
return self
Этот фрагмент кода вы можете увидеть здесь:GitHub.com/Python/Использование продукта…
Итак, когда вы используете+=При объединении списков и кортежей в основном списки используютextendДобавьте в него содержимое кортежа. Это не даст ошибки:
>>> a = [1, 2, 3]
>>> a.extend((4,))
>>> a
[1, 2, 3, 4]