Before we go further into how variables are treated in Elisp, we should really revisit the real meaning a ``variable''. OK, stop staring. This fundamental concept in programming is also somewhat notorious in that most folks (including professional programmers) do not have a sound handle on it. It is my firm belief that a lack of a solid understanding of this concept is the real reason why so many people have trouble understanding pointers in C and C++.
That is not to say that the concept of a Variable is trivial to understand. As a matter of fact, philosophers of the 19th and early 20th centuries, working on systematising the logical foundation of mathematics, found it fairly difficult to nail down the nature of variables they so happily used in their symbolic logic proofs and what not. They agonised over a suitable definition for it. Bertrand Russell, in The Principles of Mathematics, published in 1903, says:
The variable is perhaps the most distinctively mathematical of all notions; it is certainly also one of the most difficult to understand. [...much philisophical mumbo-jumbo snipped..] It appears from the above discussion that the variable is a very complicated logical entity, by no means easy to analyse correctly.
It is generally conceeded by philosophers that the concept did not receive complete clarity till computer scientists arrived on the scene, and pointed out that a variable is a named location. That's it. Imagine a location in the RAM of your computer that is identified by a unique address and also given a name. This is just like a real-life domestic post box. Each post box has a unique address, and each such address also has a name, not necessarily unique (Note however that the name+address combo is unique). A variable also has some contents, just like a real-life post box has some letters inside it. So, when we say ``x is a variable'', it is short for ``there is a location in memory that we call x; this memory location can contain different things contents at different points in time''. (Note that the contents of a variable do not define the variable, hence in the above definition, we restrict it to the name and location)
There is a special twist in the way Lisp handles variables, and this issue needs to be clarified before going into details of the actual handling of variables.