This is my understanding...Correct me if I am wrong.
When you pass an object to a method, a copy of the reference to that object will be passed. However, the copy of the reference is still pointing to the original object.
1.a = "one" //reference a is pointing to the string "one"
2.when you pass a to a method, a "copy of reference a" is made and it is given to the method. Remember, it is also pointing to "one"
So, when we say, a.append in a method, we are actually appending the object that "copy of reference a" is currently referring to..in this case it is the same as "original reference a i.e "one".
3.But, when you say b=a, you are actually making the "copy of reference b" point to value in a. However your "original reference b" is still pointing to "two" . Now your "copy of reference b" and your "original reference b" are pointing to two different things.
So, when you print the value whatever the "original reference b" is pointing to will be printed..that is "two" in this case.
Drawing a diagram to visualize this helps.