`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)