You really don't want to do what you're asking for. Ned Batchelder has a great explanation of why. I have a not as great one.
But if you've read those, and you're convinced you actually do have one of those rare cases where it really is the right thing to do, the way to look up a global variable by name is to use the globals
function to get the global namespace as a dictionary, then look it up there:
>>> lst = ['one', 'two', 'three']
>>> one = numbers('a')
>>> globals()[lst[0]].letter
'a'
Notice that you could do this a lot more easily, and a lot more readably, if you just created and used a dictionary in the first place:
>>> dct = {'one': numbers('a'), 'two': numbers('b'), 'three': numbers('c')}
>>> dct['one'].letter
'a'
>>> dct[lst[0]].letter
'a'
And, besides being more readable and more explicit, it's also more powerful, because you can build any dict you want, not just whatever globals
has. You can even build the dict and the numbers together in one fell swoop:
>>> numbers = (numbers(letter) for letter in string.ascii_lowercase)
>>> dct = dict(zip(lst, numbers))