python
nonlocal 변수
Chan Lee
2025. 7. 3. 12:22
Python 함수를 다룰 때에, nested function definition에서 inner function의 함수 프레임에서, 상위 프레임의 변수를 수정하려고 하면 오류가 발생합니다.
n을 함수 인자로 받아, n번 특정 문자를 출력해주는 또 다른 함수를 반환하는 print_n_times 함수에 대해서 알아보겠습니다.
def print_n_times(n):
def a(word):
times = n
while times:
print(word)
times -= 1
return a
print_n_times(2)("hey")
최초 인자로 전달된 n (2)를 times 라는 a 함수 내의 로컬 변수로 복사한 뒤, 해당 변수를 통해 while loop을 컨트롤 했습니다.
이와 같은 경우 의도된 대로 함수가 작동합니다.

하지만 만약 a 함수 내에서 times 로 복사하지 않고 n 을 직접 변경하고자 하면 어떤 일이 발생할까요?
def print_n_times(n):
def a(word):
while n: # n 직접 접근
print(word)
n -= 1 # n 변경
return a
print_n_times(2)("hey")

인자 n에 대한 접근 권한은 최소 print_n_times 함수 또는 그 이상, 우리의 경우 글로벌 프레임에서만 가능합니다.
이 점은 파이썬이 그렇게 디자인 되었기 때문이고 다른 언어에서는 또 다르게 작동할 수 있습니다.
그렇다면 만약 의도적으로 상위 프레임의 인자를 변경하고자 한다면 어떻게 해야 할까요?
def print_n_times(n):
def a(word):
nonlocal n # 추가
while n:
print(word)
n -= 1
return a
print_n_times(2)("hey")

사용하고자 하는 하위 프레임 내에서 상위 프레임의 변수를 nonlocal로 지정하면 기존처럼 활용할 수 있습니다.
하지만, 안전하고 유지보수가 쉬운 코드를 디자인하기 위해서는 되도록이면 전달된 인자를 직접 사용하는 것 보다는 추가적 변수로 복사를 하고 해당 변수를 활용하는 것이 권장됩니다.
특정 경우에서는 직접적으로 변경하는 것이 요구될 수 있기 때문에, 숙지해 두면 좋겠습니다.