Channi Studies

nonlocal 변수 본문

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을 컨트롤 했습니다.

이와 같은 경우 의도된 대로 함수가 작동합니다.

 

하지만 만약 함수 내에서 times 로 복사하지 않고 을 직접 변경하고자 하면 어떤 일이 발생할까요?

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로 지정하면 기존처럼 활용할 수 있습니다. 

 

하지만, 안전하고 유지보수가 쉬운 코드를 디자인하기 위해서는 되도록이면 전달된 인자를 직접 사용하는 것 보다는 추가적 변수로 복사를 하고 해당 변수를 활용하는 것이 권장됩니다. 

특정 경우에서는 직접적으로 변경하는 것이 요구될 수 있기 때문에, 숙지해 두면 좋겠습니다. 

'python' 카테고리의 다른 글

[LeetCode] 221. Maximal Square  (0) 2025.03.16
Iterable, Iterator, Generator  (0) 2025.02.21
Bitwise Operators  (0) 2025.02.21
Files and Exceptions  (0) 2025.02.10
Tuple 튜플  (0) 2025.01.26