我有一點很難理解什麼是用下面的函數腳麻: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