
파이썬 프로그래밍을 시작할 때 가장 먼저 마주하는 벽 중 하나가 바로 변수의 범위(Scope)입니다. "분명 변수를 선언했는데 왜 함수 밖에서는 사용할 수 없을까?" 혹은 "함수 안에서 값을 바꿨는데 왜 원래 변수는 그대로일까?"와 같은 의문은 모두 지역 변수(Local Variable)와 전역 변수(Global Variable)의 차이에서 기인합니다. 이 글에서는 파이썬의 변수 유효 범위가 결정되는 방식인 LEGB 룰을 바탕으로, 효율적인 메모리 관리와 코드 가독성을 높이기 위한 변수 활용 전략을 심층적으로 다룹니다.
1. 변수의 스코프(Scope)란 무엇인가?
스코프는 프로그래밍 언어에서 변수가 유효한 범위를 의미합니다. 파이썬은 변수가 선언된 위치에 따라 해당 변수에 접근할 수 있는 영역을 엄격히 제한합니다. 이를 통해 이름 충돌을 방지하고 메모리를 효율적으로 관리합니다.
지역 변수 (Local Variable)
지역 변수는 특정 함수 내부에서 정의된 변수입니다. 이 변수는 함수가 호출될 때 생성되며, 함수의 실행이 종료되면 메모리에서 즉시 소멸합니다. 즉, 함수 외부에서는 해당 변수의 존재를 알 수 없습니다.
전역 변수 (Global Variable)
전역 변수는 함수의 외부, 즉 스크립트의 최상위 수준(Top-level)에서 정의된 변수입니다. 프로그램이 실행되는 동안 어디서든 접근이 가능하며, 프로그램이 종료될 때까지 메모리에 유지됩니다.
2. 지역 변수와 전역 변수의 핵심 비교
두 변수의 차이점을 명확히 이해하기 위해 구조적 특징을 표로 정리하였습니다.
| 비교 항목 | 지역 변수 (Local Variable) | 전역 변수 (Global Variable) |
|---|---|---|
| 선언 위치 | 함수 또는 메서드 내부 | 함수 외부, 모듈 최상단 |
| 접근 범위 | 선언된 함수 내부로 제한 | 코드 전체 (어디서나 접근 가능) |
| 생명 주기 | 함수 실행 시 생성, 종료 시 소멸 | 프로그램 시작 시 생성, 종료 시 소멸 |
| 메모리 관리 | 스택(Stack) 영역에 주로 할당 | 데이터/힙 영역에 지속적 할당 |
| 수정 방식 | 직접 수정 가능 | 함수 내 수정 시 global 키워드 필요 |
| 권장 사용 | 적극 권장 (캡슐화 및 보안) | 최소화 권장 (사이드 이펙트 방지) |
3. 파이썬의 변수 탐색 우선순위: LEGB 룰
파이썬 인터프리터는 변수를 찾을 때 다음과 같은 순서를 따릅니다. 이를 LEGB Rule이라고 합니다.
- Local (L): 현재 함수 내부
- Enclosing (E): 중첩 함수 구조에서 내부 함수를 감싸고 있는 외부 함수의 범위
- Global (G): 모듈 최상위 수준
- Built-in (B):
print(),len()과 같은 파이썬 내장 함수/예약어
4. 실전 코드 예제 (Sample Examples)
예제 1: 기본적인 지역 변수와 전역 변수
# 전역 변수 선언
message = "I am Global"
def my_function():
# 지역 변수 선언
message = "I am Local"
print("Inside function:", message)
my_function()
print("Outside function:", message)
결과: 함수 내부에서는 "I am Local"이 출력되지만, 함수 외부의 전역 변수에는 영향을 주지 않습니다. 이는 파이썬이 함수 내부에 동일한 이름의 변수가 있을 경우 지역 변수를 우선시하기 때문입니다.
예제 2: 함수 내에서 전역 변수 수정하기 (global 키워드)
count = 0
def increment():
global count # 전역 변수를 사용하겠다고 명시
count += 1
print("Current count:", count)
increment()
increment()
결과: global 키워드가 없다면 파이썬은 count += 1을 수행할 때 count를 새로운 지역 변수로 간주하여 에러(UnboundLocalError)를 발생시킵니다.
5. 전문가의 조언: 왜 전역 변수를 남용하면 안 되는가?
대규모 프로젝트에서 전역 변수의 남용은 '스파게티 코드'의 주범이 됩니다. 그 이유는 다음과 같습니다.
- 추적의 어려움: 어떤 함수가 언제 전역 변수를 수정했는지 파악하기 어렵습니다.
- 재사용성 저하: 전역 변수에 의존하는 함수는 다른 프로젝트에서 독립적으로 사용하기 힘듭니다.
- 동시성 문제: 멀티쓰레딩 환경에서 여러 함수가 동시에 전역 변수에 접근할 때 데이터 무결성이 깨질 수 있습니다.
따라서, 가급적 함수의 인자(Arguments)와 반환값(Return values)을 통해 데이터를 주고받는 것이 객체지향 설계와 클린 코드의 핵심입니다.
6. 결론
지역 변수는 짧은 생명 주기를 통해 메모리를 절약하고 데이터 보안을 유지합니다. 반면 전역 변수는 설정값이나 공유 자원 관리에 유용하지만 신중하게 사용해야 합니다. LEGB 룰을 이해하고 변수 스코프를 설계하는 능력은 숙련된 파이썬 개발자로 나아가는 첫걸음입니다.
출처 및 참고문헌
- Python Software Foundation. "Python Language Reference, version 3.12 - Execution Model." (docs.python.org)
- Lutz, M. (2013). "Learning Python." O'Reilly Media.
- Real Python Tutorials. "Namespaces and Scope in Python."
'Artificial Intelligence > 60. Python' 카테고리의 다른 글
| [PYTHON] 함수 기본 값(Default Parameter) 설정 시 치명적인 실수와 해결 방안 (0) | 2026.02.13 |
|---|---|
| [PYTHON] 함수 안에서 전역 변수를 수정하려면? (global 키워드) (0) | 2026.02.13 |
| [PYTHON] @staticmethod와 @classmethod : 객체지향 설계의 품격을 높이는 마법의 데코레이터 (0) | 2026.02.12 |
| [PYTHON] 매개변수(Parameter)와 인자(Argument)의 차이는? : 개념적 정의부터 메모리 구조까지 (0) | 2026.02.12 |
| [PYTHON] 대량 데이터 루프 성능 최적화 : 초당 백만 개 처리의 비밀 (0) | 2026.02.12 |