У меня возникли некоторые проблемы с пониманием, что происходит со следующей функцией:
def ness():
pie='yum'
vars()[pie]=4
print vars()[pie]
print yum
Итак, когда я бегу, я получаю такой результат:
>>> ness()
4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in ness
NameError: global name 'yum' is not defined
Если я не пишу это как функцию, а просто набираю ее в командной строке по одной строке, она работает нормально, например:
>>> pie='yum'
>>> vars()[pie]=4
>>> print vars()[pie]
4
>>> print yum
4
>>>
Edit:
Предположим, я хотел сделать вещи немного более сложными, чем это, и вместо того, чтобы устанавливать значение yum и печатать это значение, я определяю некоторые функции и хочу вызвать одну из них на основе некоторого ввода:
def ness(choo):
dic={}
dessert=()
dnum=[10,100]
desserts='pie'
dic[dessert]=str(desserts[bisect(dnum,choo)])
vars()[dic[dessert]]()
def p():
print 'ummmm ummm'
def i():
print 'hooo aaaaa'
def e():
print 'woooo'
Поэтому, когда я звоню ness, я получаю ключевую ошибку:
>>> ness(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in ness
KeyError: 'p'
Теперь я знаю, что могу делать такие вещи с некоторыми утверждениями elif, но мне интересно, будет ли это работать тоже, и если использование bisect, как это, будет более эффективным (скажем, если мне нужно проверить 1000 значений choo) чем использование elifs.
Большое спасибо за помощь.