python list += str
Есть переменная типа 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']
Почему += позволяет это сделать?
Есть переменная типа 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']
Почему += позволяет это сделать?
В любой изменяемой последовательности (в том числе 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
В тоже время оператор +
принимает только список, так как не очень понятно, что должно получится при сложении списка и строки - список или строка?
+=
и +
это разные операторы, которые вызывают разные специальные (магические) методы.
Для +=
это __iadd__
. Он используется, когда мы хотим изменить существующий объект, если он изменяемый.
Для +
это __add__
. В этом случае, как правило, создается новый объект.
list
реализован на c, но принцип тот же. Вот в данном случае логика класса list
написана так, чтобы он интерпретировал +=
как добавление в список. Разработчики языка подумали о нашем удобстве.
Для сложения необходимо строку преобразовать в список:
>>> lst = [1, 2]
>>> string = 'ab'
>>> lst = lst + list(string) # Преобразовать в список вида ['a', 'b']
[1, 2, 'a', 'b']