Except if __iadd__ doesn't exist on the type, then __add__ is called. The variable is always reassigned. Quick example:
x = (0, [1, 2])
try:
x[1] += [3] # calls list.__iadd__, then reassigns x[1]
except TypeError as e:
print(e)
x += (4,) # calls tuple.__add__, then reassigns x
print(x)
What is printed?