2016-08-07 4 views
0

LEGB 규칙이 적용되는 방식에 대해 꽤 혼란스러워합니다. I Local은 함수 또는 클래스 메서드 내에있을 수 있음을 알고 있습니다 (예 : ). 동봉 된 것은 동봉 함수 (예 : 함수가 다른 함수 안에 싸인 경우) 일 수 있습니다. Global은 실행 스크립트 자체의 최상위 디렉토리 인 을 가리키며, Built-in은 파이썬이 자체적으로 예약하는 특별한 이름 입니다. 출력은네임 스페이스 - 범위 Python

a = 'global' 

def outer(): 

    def len(in_var): 
     print('called my len() function: ') 
     l = 0 
     for i in in_var: 
      l += 1 
     return l 

    a = 'local' 

    def inner(): 
     global len 
     nonlocal a 
     a += ' variable' 
    inner() 
    print('a is', a) 
    print(len(a)) 

outer() 

print(len(a)) 
print('a is', a) 

출력

('a is', 'local') 
called my len() function: 
5 
15 
('a is', 'global variable') 
+0

저는 파이썬 3.5.2에서 다른 결과를 얻고 있습니다. –

답변

0

내가 3.4.2

a is local variable 
called my len() function: 
14 
6 
a is global 
으로 다음과 같은 결과를 얻고있다 is.thanks 무엇을 왜 그냥>는 여기에 어떻게 적용되는지를 얻을하지 않습니다

설명을 위해 실제로 거의 모든 중요한 세부 사항이 있지만 핵심은 nonlocal 문으로 식별자가 가장 가까운 엔코 드 범위에서 이전에 바운드 된 변수를 참조하도록합니다. ainner()을 나타내며 그 이후로는 a = 'local'에 영향을줍니다. print('a is', a)은 a를 local variable으로 사용하고 길이는 14입니다. 그러나 전역 범위에서 a = 'global'은 여전히 ​​효과적입니다.

차이점을 조사 할 수있는 환경 세부 정보를 알려주실 수 있습니까?

+0

안녕하세요. 고맙습니다. PyCharm 2016.2를 사용하여 모듈에 Anaconda를 가리 킵니다. 파이썬 버전은 2.7입니다. 나는 규칙이 이해되는 줄 알았지 만, 증가가 어떻게 일어나는지, 그리고 출력의 순서는 여전히 혼란 스럽다. – uniXVanXcel

+1

파이썬 2.7에 대해 확신 하는가? Afaik, nonlocal은 해당 버전에서 사용할 수 없으므로 오류가 발생합니다. – Heval

+0

예 PyCharm에는 앞으로 호환성이 있다고 생각합니다. PyCharm은 두 개 이상의 Python 버전에 대해 코드 호환성을 검사합니다. – uniXVanXcel

관련 문제