當在exec
內部定義變量/函數時,它似乎轉到locals()
而不是globals()
如何更改此行爲?只有當您將全局和本地字典傳遞到exec
時,纔會發生這種情況。Python中的作用域exec
例子:
exec("""
a = 2
def foo():
print a
foo()""") in {},{}
當你試試這個:
NameError: global name 'a' is not defined
當在exec
內部定義變量/函數時,它似乎轉到locals()
而不是globals()
如何更改此行爲?只有當您將全局和本地字典傳遞到exec
時,纔會發生這種情況。Python中的作用域exec
例子:
exec("""
a = 2
def foo():
print a
foo()""") in {},{}
當你試試這個:
NameError: global name 'a' is not defined
如果a
不是全局,使其全球...
exec("""
global a
a = 2
def foo():
print a
foo()""") in {}, {}
很奇怪對我來說太乍一看。但也有一些更多的輸出,我發現了原因:
>>> 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
謝謝!另一個解決方案是隻通過全球字典。但很高興知道原因。 –
是的,但'exec'中的代碼是由第三方編寫,不知道走了進去的'exec',所以他們沒有理由使用全局。 –
那你爲什麼不在問題中提到?我以爲你是一個初學者(11代表),只是不知道'全球'。 – BrtH