Default arguments to functions are evaluated only once, when the function is defined. This means that your function definition is equivalent to:
y0_ = y0.copy()
def g(i, y = y0_):
print "y that goes to g (every time is different) \n", y
etc
Which explains why your y argument changes every time.