2010-06-01 5 views
1

LEGB 규칙에 대해 알고 있습니다. 그러나 함수가 둘러싼 함수에서 정의 된 변수에 대한 읽기 액세스 권한을 가지고 있는지 여부를 간단하게 테스트하는 것은 실제로 작동하지 않는 것 같습니다. 즉 :내 함수가 둘러싼 함수에서 변수에 액세스 할 수없는 이유는 무엇입니까?

#!/usr/bin/env python2.4 
'''Simple test of Python scoping rules''' 

def myfunction(): 
    print 'Hope this works: '+myvariable 

def enclosing(): 
    myvariable = 'ooh this worked' 
    myfunction() 

if __name__ == '__main__': 
    enclosing() 

결과 :

NameError: global name 'myvariable' is not defined 

내가 뭔가 잘못하고 있습니까? LEGB 결의안보다 더 많은 것이 있습니까? 이처럼 한 경우에 당신이 할 수있는

+3

그냥'enclosing' 함수를 명명하면 너무 :) –

+0

그래. 나는 틀린 호출 함수를 포함하는 'enclosing'을 잘못 생각했다. 그러나 실제로는 중첩 된 함수의 부모를 의미한다. – mikemaccana

+0

유효한 태그를 되돌릴 필요가 없습니다. 그것은 당신에 관한 것이 아니라 질문에 관한 것입니다. – SilentGhost

답변

2

...

:

#!/usr/bin/env python2.4 
'''Simple test of Python scoping rules''' 

def enclosing(): 
    myvariable = 'ooh this worked' 

    def myfunction(): 
     print 'Hope this works: ' + myvariable 

    myfunction() 

if __name__ == '__main__': 
    enclosing() 

는 ... 그렇지 않으면 기능이 제대로은 않습니다 (볼 위치를 알 수 없습니다, 그러나 본다 전역 변수를 가져오고있는 이유는 무엇입니까?) (함수를 중첩 된 함수로 정의 할 수 없다면 매개 변수로 넘김)

+0

(변수를 * 공유하려면 전역 변수를 공유 할 수 있도록 두 함수에 "global"키워드를 추가 할 수 있지만 절대적으로 필요하지 않는 한 ** 강력하게 ** 이와 유사한 행위를하지 않도록 권고합니다) –

+0

(즉, "전역 myvariable"두 함수의 시작 부분에) –

+0

Terence에게 감사드립니다. 호출 함수가 '둘러싸는'것으로 간주되었다고 잘못 가정 한 것 같지만 용어는 특히 중첩 된 함수의 부모를 의미합니다. – mikemaccana

관련 문제