Esto es un problema de scope (como han comentado arriba), que acaba liando al que no tiene claro como va el paso de argumentos (que siempre es por valor).
Los argumentos son "copias" de valores, y en el caso de los no-primitivos el valor es la referencia.
Dicho de otro modo, "a" es un puntero nuevo al objeto. El procedimiento change está reasignando/reapuntando "a".