2012-07-04 2 views
4

변수/함수가 exec 안에 정의 된 경우 globals() 대신이 코드는 locals()으로 표시되는 것 같습니다. 이 문제는 글로벌 사전과 로컬 사전을 exec에 전달할 때만 발생합니다.범위 내에서 파이썬 exec

예 :이 때

exec(""" 
a = 2 

def foo(): 
    print a 

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

... a 글로벌 아니다

NameError: global name 'a' is not defined 

답변

-1

경우, 글로벌하게

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에서 말했다 : 파이썬에서

만 암시 전역 함수 내에서 참조되는 변수 그러나 좀 더 출력이 난 이유를 발견했다. 변수가 함수 본문 내의 임의의 위치에 새 값이 지정되면 로컬 변수로 간주됩니다. 함수 내에서 변수에 새로운 값이 할당되면 변수는 암시 적으로 지역 변수이므로 명시 적으로 전역 변수로 선언해야합니다.

그래서 하나 개의 솔루션은 전역과 지역 주민에 대해 동일한 DICT를 사용할 수 있습니다 :

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

감사! 또 다른 해결책은 글로벌 디딕스를 통과하는 것입니다. 그러나 그 이유를 아는 것이 좋다. –