python list += str

Рейтинг: 2Ответов: 3Опубликовано: 16.07.2023

Есть переменная типа list и переменная типа str

lst = [1, 2]
string = 'ab'
lst = lst + string # TypeError: can only concatenate list (not "str") to list
lst += string # [1, 2, 'a', 'b']

Почему += позволяет это сделать?

Ответы

▲ 1Принят

В любой изменяемой последовательности (в том числе list) оператор += эквивалентен вызову метода extend (см. таблицу "Mutable Sequence Types" в документации по Python):

>>> lst = [1, 2]
>>> lst += [3, 4]
>>> lst.extend([5, 6])
>>> lst
[1, 2, 3, 4, 5, 6]

А метод extend списка принимает итерируемый объект (каким и является str) и добавляет к концу списка каждый элемент переданного ему итерируемого объекта. Элементами строки (str) являются отдельные её символы:

>>> for c in 'abc':
...     print(c)
... 
a
b
c

В тоже время оператор + принимает только список, так как не очень понятно, что должно получится при сложении списка и строки - список или строка?

▲ 3

+= и + это разные операторы, которые вызывают разные специальные (магические) методы. Для += это __iadd__. Он используется, когда мы хотим изменить существующий объект, если он изменяемый. Для + это __add__. В этом случае, как правило, создается новый объект.

list реализован на c, но принцип тот же. Вот в данном случае логика класса list написана так, чтобы он интерпретировал += как добавление в список. Разработчики языка подумали о нашем удобстве.

▲ 2

Для сложения необходимо строку преобразовать в список:

>>> lst = [1, 2]
>>> string = 'ab'
>>> lst = lst + list(string)  # Преобразовать в список вида ['a', 'b']
[1, 2, 'a', 'b']