A + = B Python не обязательно эквивалентен A = A + B

Python

Мы часто видим это утверждение в некоторых блогах:

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]