2012-07-04 37 views
4

當在exec內部定義變量/函數時,它似乎轉到locals()而不是globals()如何更改此行爲?只有當您將全局和本地字典傳遞到exec時,纔會發生這種情況。Python中的作用域exec

例子:

exec(""" 
a = 2 

def foo(): 
    print a 

foo()""") in {},{} 

當你試試這個:

NameError: global name 'a' is not defined 

回答

-1

如果a不是全局,使其全球...

exec(""" 
global a 
a = 2 

def foo(): 
    print a 

foo()""") in {}, {} 
+0

是的,但'exec'中的代碼是由第三方編寫,不知道走了進去的'exec',所以他們沒有理由使用全局。 –

+0

那你爲什麼不在問題中提到?我以爲你是一個初學者(11代表),只是不知道'全球'。 – BrtH

2

很奇怪對我來說太乍一看。但也有一些更多的輸出,我發現了原因:

>>> g, l = {}, {} 
>>> print id(g), id(l) 
12311984 12310688 
>>> 
>>> exec ''' 
... a = 2 
... print 'a' in globals(), 'a' in locals(), id(globals()), id(locals()) 
... def f(): 
...  print 'a' in globals(), 'a' in locals(), id(globals()), id(locals()) 
... f() 
... ''' in g, l 
False True 12311984 12310688 
False False 12311984 12311264 

http://effbot.org/pyfaq/what-are-the-rules-for-local-and-global-variables-in-python.htm說:

在Python,那些只在函數內部引用是隱式的全局變量。如果一個變量在函數體內的任何地方被分配了一個新的值,它就被認爲是本地的。如果一個變量在函數內部被分配了一個新的值,那麼這個變量隱含地是局部的,你需要明確地聲明它是全局的。

那麼一個解決方案是使用相同的字典的全局和當地人:

>>> l = {} 
>>> exec ''' 
... a = 2 
... def f(): 
...  print a 
... f() 
... ''' in l, l 
2 
+0

謝謝!另一個解決方案是隻通過全球字典。但很高興知道原因。 –