Python3/Python3 lang

[Python3] Python 에서 nonlocal과 정적 스코프

Razelo 2021. 10. 9. 09:55

static scope에 대해서 공부하는 중에 global은 들어봤는데 nonlocal이라는게 들어본적이 없어서 찾아보았다. 

(프언 수업은 정말 역대급으로 생소한것같다. 이전에 이런 내용들을 접해본적이 없어서 꽤나 고생중이다.)

 

아래 간단한 예제를 보면 바로 이해가 될 것이다. 눈으로 따라가기에는 조금 번거로울 수 있는데 연습장에 조금씩 써보면서 딱 한번만 따라가보면 정확히 이해할 수 있다. 

 

nonlocal: 지역 변수가 아님을 선언

nonlocal이 사용된 함수 바로 한단계 바깥쪽에 위치한 변수와 바인딩을 할 수 있다. 

x = 50
def f():
    a = 777
    
    def g():
        a = 100
        
        def h():
            global x
            x = 999
            nonlocal a
            a = 333
            
        h()
        print("[Level 2] a = {}".format(a))
        
    g()
    print("[Level 1] a = {}".format(a))

f()
print("[Level 0] x = {}".format(x))

위 결과로 

333

777

999

가 출력되는 것을 확인할 수 있다. 

 

그리고 참고로 nonlocal은 함수 하나를 정의해놓고 그 안에서 nonlocal을 써서 전역변수에 영향을 주는 것은 불가능하다고 한다. 

 

(여담: 파이썬에서는 정적 스코프만을 지원한다. 동적 스코프는 현대 프로그래밍 랭귀지와는 맞지 않는 면이 있다고 한다. 이부분은 교수님의 말씀인데 글쎄 왜 그런지는 좀더 알아볼 필요가 있겠다. ) -> 맞지 않는다고 하기 보다는 일반적이지 않다는게 좀 더 정확한 표현이라고 할 수 있다. 

 

nonlocal에 대한 내용과 위의 예제는 아래 블로그에서 도움을 얻었다. 

 

감사합니다. 

 

https://devbruce.github.io/python/py-13-global,nonlocal/

 

[Python] global / nonlocal

 

devbruce.github.io

 

반응형