The syntax u0.assign() is typically used when you want to create one function u0 from a superposition of other functions, i.e.
u0, u1, u2 = Function(V), Function(V), Function(V)
u0.assign(FuntionAXPY([(1.0, u1), (2.0, u2)])
is equivalent to u0 = u1 + 2*u2.
On the other hand, 'assign' is used to create a function u0 in a MixedFunctionSpace from functions in the corresponding subspaces, i.e.
W = MixedFunctionSpace([V, V])
u0 = Function(W)
u1, u2 = Function(V), Function(V)
assign(u0, [u1, u2])
will create a function u0 in the mixed function space W, where the subfunctions u0.sub(0) and u0.sub(1) are copied from u1, u2 correspondingly.