일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 티스토리챌린지
- 배열
- Deep Learning
- programming
- 알고리즘
- array
- vscode
- Object Oriented Programming
- Class
- string
- 문자열
- Pre-processing
- raw data
- function
- 함수
- assignment operator
- 반복문
- 파이썬
- pointer
- const
- 포인터
- predictive analysis
- pass by reference
- 오블완
- Python
- baekjoon
- OOP
- 백준
- Data Science
- C++
- Today
- Total
Channi Studies
nonlocal 변수 본문
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로 지정하면 기존처럼 활용할 수 있습니다.
하지만, 안전하고 유지보수가 쉬운 코드를 디자인하기 위해서는 되도록이면 전달된 인자를 직접 사용하는 것 보다는 추가적 변수로 복사를 하고 해당 변수를 활용하는 것이 권장됩니다.
특정 경우에서는 직접적으로 변경하는 것이 요구될 수 있기 때문에, 숙지해 두면 좋겠습니다.
'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 |