Почему s = s + ... не работает там, где работает s += ...?

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

Подскажите, почему выдает ошибку, если написать s = s + ....., а если написать s += ....., то все верно, ведь s += это тоже самое, что и s = s + ....

Вот код (рабочий):

step = 5
text = "абвгдежзийклмнопрстуфхцчшщъыьэюя"
a = 'привет'
s = []
    
for i in range(len(a)):
    if a[i] in text:
        s += text[(text.index(a[i]) + step) % 32]
        

print(''.join(s))

а вот, тоже самое, только s = s + ... :

step = 5
text = "абвгдежзийклмнопрстуфхцчшщъыьэюя"
a = 'привет'
s = []
    
for i in range(len(a)):
    if a[i] in text:
        s = s + text[(text.index(a[i]) + step) % 32]
        
print(''.join(s))

Ответы

▲ 5

Ошибка возникает из-за разницы в типе данных.

В первом случае, когда вы используете оператор "+=", вы добавляете в переменную "s" отдельные символы из строки "text". И таким образом переменная "s" остается типом "list" (список), что позволяет вам в конечном итоге объединить все символы в строку, используя "join".

Во втором случае, когда вы используете оператор "+", вы добавляете символ из строки "text" в переменную "s" напрямую. Но переменная "s" была инициализирована как пустой список, поэтому оператор "+" ожидает объект типа "list", а не символ. Именно поэтому возникает ошибка.

Если вы хотите использовать оператор "+", вам нужно инициализировать переменную "s" как пустую строку, а не список

▲ 5

Оператор += у списка добавляет в конец списка по очереди элементы из итерируемого объекта, а у вас там строка, которая является итерируемым объектом:

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

А оператор + объединяет два списка:

>>> [1, 2] + [3, 4]
[1, 2, 3, 4]

При этом умеет работать только со списками:

>>> [1, 2] + (3, 4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list

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

▲ 2

Дополню другие ответы, может так понятнее будет. По сути для списков

s += x

Работает так же, как

s.extend(x)

Метод списка extend может принимать на вход строки и символы (отдельный символ - это тоже строка) и добавлять их в конец списка, итерируясь по ним. А вот при сложении

s = s + x

Уже действуют другие правила, списки можно складывать только со списками.

И это, кстати, логично, что += был реализован как extend. И оператор iadd (inplace add) и оператор extend изменяют исходный список "по месту". А вот обычный оператор сложения add создаёт на выходе новый список. Они работают по-разному.