본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] nonlocal 키워드와 global 키워드의 3가지 스코프 제어 차이와 변수 오염 해결 방법

by Papa Martino V 2026. 3. 2.
728x90

nonlocal 키워드와 global 키워드
nonlocal 키워드와 global 키워드

 

파이썬 프로그래밍을 진행하다 보면 함수 내부에서 외부 변수의 값을 수정해야 하는 상황을 마주하게 됩니다. 이때 초보 개발자들이 가장 흔히 저지르는 실수는 단순히 변수 이름을 호출하여 값을 할당하려 하는 것입니다. 하지만 파이썬의 LEGB(Local, Enclosing, Global, Built-in) 스코프 규칙에 따라, 명시적인 키워드 없이 외부 변수를 수정하는 것은 불가능합니다. 본 포스팅에서는 globalnonlocal 키워드의 명확한 동작 원리를 분석하고, 중첩 함수 구조에서 발생하는 데이터 무결성 문제를 해결하는 전문가급 가이드를 제공합니다.


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이라고 합니다. globalnonlocal은 이러한 모호성을 제거하고 개발자의 의도를 명확히 코드로 표현하는 수단입니다.


6. 결론: 올바른 스코프 제어의 중요성

효율적인 파이썬 코드를 작성하기 위해서는 변수가 메모리의 어느 계층에서 관리되는지 이해하는 것이 필수적입니다. global은 모듈 전체의 공통 상태를 관리할 때 유용하며, nonlocal은 함수형 프로그래밍의 특징인 캡슐화를 강화할 때 강력한 힘을 발휘합니다. 프로젝트의 규모와 데이터의 수명 주기를 고려하여 적절한 키워드를 선택하는 습관을 들이시기 바랍니다.

내용의 출처 및 전문 기술 레퍼런스

  • Python Software Foundation: "Control Flow Tools - The global and nonlocal statements"
  • Real Python: "Python Scope & the LEGB Rule: Resolving Names in Your Code"
  • "Learning Python" 5th Edition by Mark Lutz (O'Reilly Media)
728x90