Ответ 1
Основная идея заключается в том, что операторы +
и +=
не обязательно являются одной и той же операцией в Python, и они действительно различны для списков. Операция +
выполняется магическим методом __add__
а операция +=
- магическим методом __iadd__
(добавление на месте). Эти магические методы происходят от типа слева от оператора.
Для добавления списка на месте не требуется список справа, только итерация. Затем элементы по очереди берутся из итерируемого и добавляются в список. Это похоже на метод extend
списка. Таким образом, оператор +=
не пренебрегает типом объекта справа, он просто расширяет возможные типы, которые можно использовать.
Такое поведение несколько сбивает с толку - должно быть, потому что вы второй человек за два дня, который, как я видел, задает аналогичный (но не дублирующий) вопрос по этому вопросу. Однако такое поведение удобно - теперь у нас есть простой способ объединить список с любым итеративным.
Подробнее об этом см. Почему списки Python позволяют + = кортеж, когда вы не можете + кортеж? ,
Как говорится в комментарии @khelwood, результирующий тип для a += b
очевиден: тип a
. Таким образом, тип b
может быть гибким. Результирующий тип a + b
не очевиден. Python является строго типизированным языком и ненавидит такую двусмысленность. Дзен Питона заявляет
Явное лучше, чем неявное.
а также
Перед лицом двусмысленности откажитесь от соблазна гадать.
а также
Хотя практичность превосходит чистоту.
Таким образом, текущее поведение вполне соответствует Python Zen. Я отмечаю, что в дзен нет ничего о последовательности.