This bit bothered me slightly:
>But what if we put a mutable object into the immutable tuple? Well, modification works, but we also get a TypeError at the same time.
tup = ([],)
tup[0] += [1]
Of course that's an error. It's equivalent to: temp = tup[0]
temp += [1]
tup[0] = temp
But the given explanation is way too obtuse. This shouldn't be a mystery at all:> If we try to extend the list via += "then the statement executes STORE_SUBSCR, which calls the C function PyObject_SetItem, which checks if the object supports item assignment. In our case the object is a tuple, so PyObject_SetItem throws the TypeError. Mystery solved."