This question leads on to some fun diversions concerning the nature of python objects and it's garbage collector:
It's probably helpful to understand that all variables in python are really pointers, that is they are names in a namespace (implemented as a hash-table) whch point to an address in memory where the object actually resides.
Asking for the value of an uninitialized variable is the same as asking for the value of the thing a pointer points to when the pointer has not yet been created yet... it's obviously nonsense which is why the most sensible thing Python can do is throw a meaningful NameError.
Another oddity of the python language is that it's possible that an object exists long before you execute an assignment statement. Consider:
a = 1
Did you magically create an int(1) object here? Nope - it already existed. Since int(1) is an immutable singleton there are already a few hundred pointers to it:
>>> sys.getrefcount(a)
592
>>>
Fun, eh?
EDIT: commment by JFS (posted here to show the code)
>>> a = 1 + 1
>>> sys.getrefcount(a) # integers less than 256 (or so) are cached
145
>>> b = 1000 + 1000
>>> sys.getrefcount(b)
2
>>> sys.getrefcount(2000)
3
>>> sys.getrefcount(1000+1000)
2