You are right. Quoting an answer from stackoverflow, "a = a + [5] is syntactic sugar for a = a.__add__([5]), and since a.__add__([5]) returns a new object, a holds a reference to the new object rather than the old object."
This is likely to be coherent with the principle that python does not like implicit side effects. If you want to mutate the list object, you have to be explicit about it, and use the "compound operator" += :
"a +=[5] (as well as a.append(5) ) is syntactic sugar for a = a.__iadd__([5]). The difference is that the latter method - __iadd__() - does not create a new object in memory. Rather, it modifies the existing list object, and returns a reference to it."