Before the explanation, let me point out that `=` is shorthand for [`Set`][1] and `:=` for [`SetDelayed`][2]; this facilitates searching the docs. Also, as Simon Woods points out in a comment to the question, there is a [tutorial][3] on this. Now, `y[x_]=expr` means evaluate `expr`, then whenever you see `y[something]` evaluate evaluate what resulted. `y[x_]:=expr` means "whenever you see `y[something]`, evaluate `expr` anew". Here's how to see it: a = 5; y[x_] = a*x y[3] a = 10 y[3] (* 15 10 15 *) That is, when you define `y`, it evaluates the right hand side to `5*x` and assigns that; if you change `a` later, it never sees it. On the other hand, a = 5; f[x_] := a*x f[3] a = 10 f[3] (* 15 10 30 *) Compare also: ?? y ![Mathematica graphics](https://i.sstatic.net/28rHs.png) ??f ![Mathematica graphics](https://i.sstatic.net/t7ijj.png) [1]: http://reference.wolfram.com/mathematica/ref/Set.html [2]: http://reference.wolfram.com/mathematica/ref/SetDelayed.html [3]: http://reference.wolfram.com/mathematica/tutorial/ImmediateAndDelayedDefinitions.html