[Python] 변수 스코프 - 지역변수와 전역변수, LEGB규칙, global키워드
by 우와한개발자
1. 지역변수와 전역변수
1) 지역변수(Local Variable)
- 함수 안에 선연된 변수
- 로컬 심볼 테이블(지역 심볼 테이블)에 저장
- 지역변수는 반드시 초기화 하고 사용해야함
2) 전역변수(Global Variable)
- 함수 밖에 선언된 변수
- 전역 심볼 테이블에 저장
| 구분 | 선언 위치 | 저장 위치 |
| 지역변수 (Local) | 함수 안 | 로컬 심볼 테이블 |
| 전역변수 (Global) | 함수 밖 | 전역 심볼 테이블 |
3) 심볼 테이블(Symbol Table)
- 파이썬에서 모든 데이터는 객체로 저장되고, 변수는 단지 객체의 이름(심볼)이다.
- 심볼 테이블은 프로그램에서 사용되는 이름(identifier)과 그 정보를 저장하는 자료구조이다.
- 스코프별로 나뉜다. (로컬 심볼 테이블, 전역 심볼 테이블)
| 구분 | 설명 |
| 전역 심볼 테이블 | 함수 밖, 프로그램 전체에서 접근 가능한 변수 저장 |
| 지역 심볼 테이블 | 함수 안, 해당 함수 내에서만 접근 가능한 변수 저장 |
2. 렉시컬 스코프와 LEGB 규칙
1) 렉시컬 lexical
- 변수의 스코프를 코드가 정의된 위치 기준으로 판단하는 방식
2) 파이썬에서의 렉시컬 특성(문자를 해석하는 규칙)
- 함수를 어휘적(Lexically)으로 검색해 변수가 지역변수인지 확인하고 지역 심볼테이블에 없으면 전역변수로 간주함
- 즉, 렉시컬 스코프는 실행 위치가 아니라 정의된 위치 기준으로 변수 범위 결정.
| 순서 | 단계 | 설명 |
| 1 | L ocal | 현재 함수 안 |
| 2 | E nclosing | 중첩 함수에서 바깥 함수 |
| 3 | G lobal | 파일 전체 |
| 4 | B uilt-in | print, len 등 파이썬 내장 |
a = 100
def func():
print("before", a) # ❌ UnboundLocalError 발생
a = 200
print("after", a)
func()
인터프리터가 print("before", a)를 실행할 때 LEGB 방식으로 a를 찾는다.
→ 함수 내부에 a = 200이 있기 때문에,
파이썬은 컴파일 시점에 a를 지역변수로 미리 결정한다.
→ LEGB에서 Local 영역에서 a를 찾게 되는데,
아직 값이 할당되지 않은 상태라 UnboundLocalError가 발생한다.
3. global 키워드
1) 기본 문법
- 지역 스코프 내에서 전역변수를 사용하는 방법
global 변수
a = 100
def func():
global a # 전역변수 사용 선언
print("before", a) # ✅ 100
a = 200
print("after", a) # ✅ 200
func()
print(a) #200
- 함수에 전달된 매개변수는 함수가 호출되는 순간 이미 값이 할당된 지역변수로 취급
foo=100
print(foo, ' | foo의 id:',id(foo)) # 100
def func1(foo):
print(foo, ' | foo의 id:',id(foo)) # 300
foo=200
print(foo, ' | foo의 id:',id(foo)) # 200
func1(300)
2) 자주 실수하는 상황
- 할당(=)이 있는 순간 파이썬이 컴파일 시점에 a를 지역변수로 확정
- 하지만 오른쪽 a + 1을 계산할 때 → 지역변수 a를 참조하려는데 아직 값이 없어 UnboundLocalError 발생
a = 10 # 전역변수
def sub():
a += 1 # a = a + 1 로 해석됨
print(a, end='')
sub() # 에러
a = a + 1
#↑ ↑
#할당 참조
'언어 > Python' 카테고리의 다른 글
| [Python] 람다식(lambda)과 타입 힌트(Type Hint) - 익명 함수와 자료형 명시 (0) | 2026.04.16 |
|---|---|
| [Python] 함수 매개변수 - 기본값, *args, **kwargs, 순서 규칙 (0) | 2026.04.16 |
| [Python] 반복문 - for와 while / break와 continue / 반복 실행 상태(progress bar : tqdm 패키지) (0) | 2026.04.16 |
| [Python] 입출력 - input()과 print() 매개변수 (0) | 2026.04.15 |
| [Python] 언더스코어(_) 정리 - 단일, private, name mangling, dunder (0) | 2026.04.15 |
블로그의 정보
우와한개발자 님의 블로그
우와한개발자