Конкатенация с использованием операторов + и + = в Python - программирование
Подтвердить что ты не робот

Конкатенация с использованием операторов + и + = в Python

Недавно я заметил несогласованность при объединении списков.

Поэтому, если я использую оператор +, он не объединяет список с каким-либо объектом другого типа. Например,

l = [1,2,3]
l = l + (4,5)        #TypeError: can only concatenate list (not "tuple") to list

Но если я использую оператор + =, он игнорирует тип объекта. Например,

l = [1,2,3]
l += "he"            #Here, l becomes [1, 2, 3,"h", "e"]

l += (56, 67)        #Here, l becomes [1, 2, 3,"h", "e", 56, 67]

Так это просто семантика языка или какая-то другая причина?

4b9b3361

Ответ 1

Основная идея заключается в том, что операторы + и += не обязательно являются одной и той же операцией в Python, и они действительно различны для списков. Операция + выполняется магическим методом __add__ а операция += - магическим методом __iadd__ (добавление на месте). Эти магические методы происходят от типа слева от оператора.

Для добавления списка на месте не требуется список справа, только итерация. Затем элементы по очереди берутся из итерируемого и добавляются в список. Это похоже на метод extend списка. Таким образом, оператор += не пренебрегает типом объекта справа, он просто расширяет возможные типы, которые можно использовать.

Такое поведение несколько сбивает с толку - должно быть, потому что вы второй человек за два дня, который, как я видел, задает аналогичный (но не дублирующий) вопрос по этому вопросу. Однако такое поведение удобно - теперь у нас есть простой способ объединить список с любым итеративным.

Подробнее об этом см. Почему списки Python позволяют + = кортеж, когда вы не можете + кортеж? ,


Как говорится в комментарии @khelwood, результирующий тип для a += b очевиден: тип a. Таким образом, тип b может быть гибким. Результирующий тип a + b не очевиден. Python является строго типизированным языком и ненавидит такую двусмысленность. Дзен Питона заявляет

Явное лучше, чем неявное.

а также

Перед лицом двусмысленности откажитесь от соблазна гадать.

а также

Хотя практичность превосходит чистоту.

Таким образом, текущее поведение вполне соответствует Python Zen. Я отмечаю, что в дзен нет ничего о последовательности.