우와한 개발자

[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
#↑      ↑
#할당   참조

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기