Ответ 1
Это фактически документировано в Python docs.
РЕДАКТИРОВАТЬ: здесь резюме, чтобы это был более полный ответ.
- Когда мы используем
+=
, Python вызывает магический метод__iadd__
для элемента, затем использует возвращаемое значение в следующем назначении элемента. - Для списков
__iadd__
эквивалентен вызовуextend
в списке, а затем возвращает список. -
Поэтому, когда мы вызываем
tup[3] += [6]
, это эквивалентно:result = tup[3].__iadd__([6]) tup[3] = result
-
Из №2 мы можем определить, что это эквивалентно:
result = tup[3].extend([6]) tup[3] = result
- Первая строка преуспевает при вызове
extend
в списке, а так как список изменен, он обновляется. Однако последующее присваивание не выполняется, потому что кортежи неизменяемы и выдает ошибку.