我有一点很难理解什么是用下面的函数脚麻:Python的瓦尔()全局名称错误
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
>>>
编辑: 假设我想使事情比这更复杂,而不是百胜设定的值并打印该值,我定义了一些功能,并希望基于一些输入调用其中的一个:
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(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in ness
KeyError: 'p'
现在我知道我可以做这样的事情了一些ELIF语句,但我不知道这是否会工作太时,如果使用开张像这样会比使用elifs更高效(比如说,如果我需要检查1000个choo值)。
非常感谢您的帮助。
使用exec做了上面写的更复杂的例子的窍门(没有像我们试图给我们的关键错误电子词典以及变量。究竟使用dict比exec更安全?是什么gnibbler说: “返回的字典不应该被修改:对相应的符号表的影响是不明确的” 这意味着使用exec这种方式可能会导致不可预见的问题? – Jamie 2010-02-09 15:17:12
exec可以执行任何python代码,例如'exec“os.system('reboot_your_pc')”,所以最好避免使用它。 – YOU 2010-02-09 15:49:42
另外exec可以给你一个令人困惑的stacktrace,并且比明确的字典要慢得多(它必须从头开始解析)。 – viraptor 2010-02-28 17:50:13