See http://en.wikipedia.org/wiki/Free_variables_and_bound_variables.  Mathematically, a free variable is a variable that is not bound, and a bound variable is one that can be changed to another (with a unique name), and not change the mathematical meaning of the expression, even in context of other expressions with the same variables.  For example, integration variables and summation indices are bound.  The concept applies to any mathematical object, not just expressions, which is why it is on Basic (for example, if you have a set {x ∈ A | x < 0}, this is exactly the same set as {y ∈ A | y < 0}, so here x and y are bound variables.  On the other hand, if you replaced 0 with a variable (like z), then that variable would be free, since changing its name without changing in other places where it is used would change the meaning of the set ({x ∈ A | x < z} ∪ {x ∈ A | x > z} is not the same as {x ∈ A | x < z} ∪ {x ∈ A | x > y}, for example).

In SymPy, there is not (yet anyway) a consistent behavior of bound variables.  In some cases, two expressions that differ only by bound variables will compare equal (for example, `Subs(f(x), x, 0) == Subs(f(y), y, 0)`).  In other cases, they do not (like `Integral(f(x), (x, 0, 1)) == Integral(f(y), (y, 0, 1)`).  See http://code.google.com/p/sympy/issues/detail?id=2440.  In general, anything could happen to them, including them automatically being replaced by dummy variables internally.