2012-04-12 36 views
-2

可能重複:
declaring a global dynamic variable in pythonexec語句將不能正確定義名稱

>>> def f(): 
     global cat 
     exec 'cat'+'="meow"' 
     return 
>>> f() 
>>> cat 
Traceback (most recent call last): 
    File "<pyshell#23>", line 1, in <module> 
    cat 
NameError: name 'cat' is not defined 

這是我遇到的問題只是一個剝離下來的例子。在我的實際腳本中,我需要創建和命名一個類的各種實例,因此是exec語句。

只需直接在shell調用

exec 'cat'+'="meow"' 

工作正常,但只要它是裝在一個函數,它似乎並沒有工作了。

回答

0

看起來像exec忽略全局,文檔有點含糊。但這個工程:

>>> def f(): 
...   global cat 
...   exec 'global cat; cat'+'="meow"' 
... 
>>> 
>>> f() 
>>> cat 
'meow' 
+2

它仍然是一個非常糟糕的主意! – 2012-04-12 11:26:21

+2

對不起,我跑了,用'global_and_I_really_understand_why_global_is_almost_always_bad'替換'global'關鍵字來編寫PEP。 (可能還有一個類似於'exec'的PEP。) – geoffspear 2012-04-12 11:27:23

+0

順便說一句,第一個'全球貓'是完全不必要的;只是'exec'中的一個在名稱被使用的範圍內。 – geoffspear 2012-04-12 11:29:24

3

我還是你爲什麼使用EXEC,它的一個不好的設計選擇和替代通常更容易,例如,而不是其他全球然後東西,你可以簡單地做這

ns = {} 

def f(): 
    ns["cat"] = "miow" 

print ns 

現在ISN不明白那個清潔工呢?

+0

對不起,但這不甚接近我打算做的。我想定義一個全局變量,而不是字典鍵。 – Axim 2012-04-12 11:40:47

+0

爲什麼!你爲什麼要定義一個全局變量? – 2012-04-12 11:46:44

+0

更重要的是,你需要一個全球字典不能做什麼? – delnan 2012-04-12 11:54:26