본문 바로가기

Python

[python] nonlocal 키워드 그리고 global 와의 차이점

반응형

 

 

파이썬 코딩 테스트를 풀다가 문제가 안풀려서 찾다보니 nonlocal 키워드라는 것을 알게 되었다. nonlocal 키워드를 알기 전에 내가 겪게된 문제 상황을 먼저 설명하는 것이 좋을것 같다. 

 

문제 상황

def test():
   a = 3

   def sum():
       a = 7
       return True

   sum()
   return a

result = test()


# 3이 출력됨
print(result)

 

일단 파이썬 함수 안에서는 함수를 따로 정의할 수 있고, 내부에 정의된 함수는 자신을 정의한 함수의 변수에 접근할 수 있다. (이런 기능을 클로저라고 한다) 

 

원래 의도는 sum 함수 내에서 a 값을 7로 변경하고 이를 test 함수에서 return 하는 것이다. (물론 실제 겪었던 문제는 훨씬 복잡했지만 이해를 위해 간단한 코드로 설명한다)

 

어떤게 문제였을까? 문제는 변수를 할당할때는 해당 함수 스코프에서만 적용된다는 것이다. 즉 a = 7로 변수를 할당하면 test 안에서 할당한 a 변수를 사용하지 않고 해당 스코프의 새로운 a로서 기능한다. 그래서 return a를 하면 test 함수의 스코프의 변수를 리턴하는 것이다. 

 

이렇다면 원래 의도 대로 코드를 동작시키려면 어떻게 해야할까? 이럴때 nonlocal 키워드를 쓰면된다.

 

 

nonlocal 키워드

말그대로 해당 변수는 'local이 아니다'고 선언해주는 키워드다. 즉 상위 함수에 변수를 참조한다고 미리 선언한다는 것이다. 사용법은 아래와 같다. 

 

def test():
   a = 3

   def sum():
       nonlocal a
       a = 7
       return True

   sum()
   return a

result = test()
print(result)

 

위와 같이 실행하면 7 이라는 값을 의도대로 출력한다. nonlocal로 선언함으로써 a 값을 상위 함수의 a 값을 사용한다. 

 

 

global 변수와의 차이

얼핏보면 global 변수와 차이가 없어보인다. 하지만 둘은 적용하는 범위가 다르다. 

 

global 변수 : 일반 함수 내에서 전역 변수를 사용할 때 사용 

noncocal 변수 : 중첩 함수 내에서 상위 함수의 변수를 사용할 떄 사용

 

 

그래서 만약 함수내의 중첩함수에서 상위 함수의 변수를 global로 접근하려고 하면 의도대로 실행되지 않는다.

 

c = 11
def test():
   a = 3
   b = 9

   def sum():
       nonlocal a
       global b
       a = 7        # nonlocal 변수는 상위 변수의 접근 O
       b = 11       # global 변수는 중첩함수내에서 상위 함수의 변수는 접근 X

       global c
       c = 13       # global 변수는 함수 외부의 변수는 접근 가능
       return True

   sum()
   return a, b, c

result = test()
print(result)     # (7, 9 , 13) 출력

 

반응형