
파이썬 프로그래밍을 진행하다 보면 함수 내부에서 외부 변수의 값을 수정해야 하는 상황을 마주하게 됩니다. 이때 초보 개발자들이 가장 흔히 저지르는 실수는 단순히 변수 이름을 호출하여 값을 할당하려 하는 것입니다. 하지만 파이썬의 LEGB(Local, Enclosing, Global, Built-in) 스코프 규칙에 따라, 명시적인 키워드 없이 외부 변수를 수정하는 것은 불가능합니다. 본 포스팅에서는 global과 nonlocal 키워드의 명확한 동작 원리를 분석하고, 중첩 함수 구조에서 발생하는 데이터 무결성 문제를 해결하는 전문가급 가이드를 제공합니다.
1. Global 키워드: 모듈 레벨의 전역 변수 제어
global 키워드는 현재 함수 스코프 내에서 특정 변수가 모듈 전체의 전역 범위(Global Scope)에 정의되어 있음을 선언합니다. 이를 통해 함수 내부에서 전역 변수의 값을 직접 수정할 수 있게 됩니다.
전역 변수 수정 시의 주의사항
전역 변수는 프로그램 전체에서 접근 가능하므로, global을 남용하면 코드의 예측 가능성이 떨어지고 '사이드 이펙트(Side Effect)'가 발생할 확률이 높아집니다. 따라서 상태 관리가 필요한 대규모 프로젝트에서는 전역 변수보다는 클래스 속성이나 의존성 주입을 활용하는 것이 권장됩니다.
2. Nonlocal 키워드: 클로저와 중첩 함수의 가교
Python 3에서 도입된 nonlocal 키워드는 중첩 함수(Nested Function) 내에서 부모 함수의 지역 변수를 수정할 때 사용됩니다. 전역 범위까지 나가지 않고, 바로 한 단계 위 혹은 여러 단계 위의 바깥쪽 지역 스코프(Enclosing Scope)를 탐색합니다.
이 키워드는 특히 데이터 은닉과 상태 유지가 필요한 클로저(Closure) 패턴을 구현할 때 핵심적인 역할을 수행합니다.
3. Global vs Nonlocal: 스코프 탐색의 3가지 핵심 차이
두 키워드는 외부 변수를 수정한다는 목적은 같지만, 참조하는 범위와 대상이 엄격히 다릅니다. 이를 아래 표로 정리하였습니다.
| 비교 항목 | Global 키워드 | Nonlocal 키워드 |
|---|---|---|
| 참조 범위 | 모듈 전체의 전역 변수(Top-level) | 현재 함수의 부모 함수 지역 변수 |
| 변수 존재 여부 | 사전에 존재하지 않아도 새로 생성 가능 | 반드시 부모 스코프에 이미 존재해야 함 |
| 주요 사용처 | 전역 설정값, 플래그 관리 | 클로저 내부의 상태(State) 유지 |
| 탐색 방식 | 중간 단계 무시, 바로 전역으로 이동 | 가까운 부모 스코프부터 역으로 탐색 |
4. 실전 Sample Example: 상태 유지 카운터 해결 방법
다음은 중첩 함수 구조에서 nonlocal을 사용하여 상태를 안전하게 유지하는 카운터 생성 예제입니다. 이 방법은 전역 변수를 오염시키지 않고도 독립적인 상태를 관리하는 해결책을 제시합니다.
# 예제: nonlocal을 활용한 독립 카운터 구현
def create_counter():
count = 0 # 부모 함수의 지역 변수 (Enclosing Variable)
def increment():
nonlocal count # 부모의 count 변수를 수정하겠다고 선언
count += 1
return count
return increment
# 테스트
counter_a = create_counter()
counter_b = create_counter()
print(f"Counter A: {counter_a()}") # 결과: 1
print(f"Counter A: {counter_a()}") # 결과: 2
print(f"Counter B: {counter_b()}") # 결과: 1 (서로 독립적임)
위 코드에서 만약 nonlocal 대신 global을 사용했다면, count라는 전역 변수가 사전에 정의되어 있지 않을 경우 오류가 발생하거나, 예상치 못한 전역 상태 변경이 일어났을 것입니다.
5. 변수 가림(Shadowing) 문제의 해결
함수 내부에서 외부 변수와 동일한 이름의 변수를 할당하면, 파이썬은 이를 새로운 지역 변수로 간주합니다. 이를 Shadowing이라고 합니다. global과 nonlocal은 이러한 모호성을 제거하고 개발자의 의도를 명확히 코드로 표현하는 수단입니다.
6. 결론: 올바른 스코프 제어의 중요성
효율적인 파이썬 코드를 작성하기 위해서는 변수가 메모리의 어느 계층에서 관리되는지 이해하는 것이 필수적입니다. global은 모듈 전체의 공통 상태를 관리할 때 유용하며, nonlocal은 함수형 프로그래밍의 특징인 캡슐화를 강화할 때 강력한 힘을 발휘합니다. 프로젝트의 규모와 데이터의 수명 주기를 고려하여 적절한 키워드를 선택하는 습관을 들이시기 바랍니다.
'Artificial Intelligence > 60. Python' 카테고리의 다른 글
| [PYTHON] yield from 구문이 재귀적 제너레이터 구조에서 해결하는 3가지 복잡성 문제와 최적화 방법 (0) | 2026.03.02 |
|---|---|
| [PYTHON] Protocol (PEP 544)을 이용한 구조적 타이핑 구현 방법과 명시적 상속의 3가지 차이점 해결 (0) | 2026.03.02 |
| [PYTHON] 익명 lambda 함수가 일반 함수 객체로 처리되는 3가지 내부 메커니즘과 차이점 해결 방법 (0) | 2026.03.02 |
| [PYTHON] 내부 동작의 핵심 : Frame Object와 실행 컨텍스트의 3가지 밀접한 관계와 구조적 차이 해결 (0) | 2026.03.01 |
| [PYTHON] 런타임 클래스 속성 동적 수정 시 메모리 오버헤드 해결 방법과 3가지 핵심 차이 (0) | 2026.03.01 |