What does assignment actually do in Python?
It binds a name to an object; it never copies. b = a makes a second name
pointing at the same object, so if that object is mutable, changing it through
either name is visible through both. This is the single sentence that explains
aliasing bugs, mutable defaults, and why passing a list into a function lets the
function change your list. Rebinding is different from mutating: b = [1, 2]
points b somewhere new and leaves a alone, while b.append(3) changes the
object both names share.