x += y для списков эквивалентен x.extend(y) и допускает произвольный итерируемый объект на месте y, например:
>>> import random
>>> L = [1]
>>> L += (i for i in range(10) if random.random() < .9)
>>> L
[1, 0, 1, 3, 4, 6, 8, 9]
Результат в данном случае может даже меняться от запуска к запуску.
Поэтому x += y работает, если x является списком даже если y является кортежем (кортеж является итерируемым объектом).
Если поменять местами x, y, то выражение перестанет работать: неизменяемые объекты, такие как кортежи не переопределяют __iadd__ метод, реализующий += оператор, и поэтому tup += [1] эквивалентно, tup = tup + [1] что ведёт к ошибке, показанной в вопросе.
Сложение списков и кортежей запрещено, так как не ясно какой результат должен быть (список или кортеж).
Подробности можно почитать выполнив help('+=') в Питон-консоли или pydoc "+=" из командной строки:
An augmented assignment expression like "x += 1" can be rewritten as
"x = x + 1" to achieve a similar, but not exactly equal effect. In the
augmented version, "x" is only evaluated once. Also, when possible,
the actual operation is performed in-place, meaning that rather than
creating a new object and assigning that to the target, the old object
is modified instead.
То есть x += 1 и x = x + 1 похожи, но результаты могут отличаться как в данном случае.
a = a + bне равноa += b. Последнее - это вродеa.extend(b)– BOPOH Sep 03 '15 at 09:46z = x... – andreymal Sep 03 '15 at 18:33