Почему + = списка внутри кортежа Python вызывает TypeError, но в любом случае изменить список?

Я просто наткнулся на то, что было довольно странно.

>>> t = ([],)
>>> t[0].append('hello')
>>> t
(['hello'],)
>>> t[0] += ['world']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t
(['hello', 'world'],)

Почему он поднимает TypeError и все же меняет list внутри tuple?

Ответы

Ответ 1

Как я уже упоминал в комментарии, += фактически изменяет список на месте, а затем пытается назначить результат первой позиции в кортеже. Из документации по модели данных:

Эти методы вызывают для реализации расширенных арифметических присвоений (+ =, = =, =,/=,//=,% =, * =, < =, → =, & =, ^ =, | =). Эти методы должны пытаться выполнить операцию на месте (модифицировать "я" ) и возвращать результат (который может быть, но не обязательно, сам).

+= поэтому эквивалентен:

t[0].extend(['world']);
t[0] = t[0];

Таким образом, изменение списка на месте не является проблемой (шаг 1.), так как списки изменяемы, но присвоение результата обратно кортежу недействительно (2. шаг) и то, где происходит ошибка.