파이썬 변수 범위 완전 정복: 전역변수 vs 지역변수

스코프(Scope)를 이해하면 디버깅이 쉬워진다

파이썬에서 함수를 사용하다 보면 “변수가 왜 안 바뀌지?”, “이건 왜 에러가 나지?”라는 의문을 자주 만나게 됩니다. 그 중심에는 변수의 ‘스코프(scope)’, 즉 전역변수와 지역변수의 개념이 있습니다. 이 글에서는 그 차이를 명확히 이해하고, 코딩 실수까지 줄일 수 있는 팁을 담아보았습니다.

Thank you for reading this post, don't forget to subscribe!

목차

변수 스코프(Scope)의 개념 이해

스코프(Scope)는 변수의 유효 범위를 의미합니다. 즉, 변수가 어디서 선언되고, 어디서 접근 가능한지를 결정하는 규칙입니다. 파이썬에서는 LEGB(L → Local, E → Enclosing, G → Global, B → Built-in) 규칙에 따라 변수 탐색이 이루어집니다.


def outer():
    x = "enclosing"
    def inner():
        x = "local"
        print(x)
    inner()

outer()  # 출력: local

팩트 문장: 변수를 선언한 위치에 따라, 프로그램의 흐름은 완전히 달라진다.

지역변수란 무엇인가?

지역변수(Local Variable)는 함수나 블록 내부에서 선언된 변수입니다. 해당 함수가 실행되는 동안에만 메모리에 존재하며, 함수가 끝나면 사라집니다. 함수 밖에서는 접근할 수 없습니다.

구분특징
지역변수함수 내부에서 선언되어 함수 외부에서는 접근 불가
사용 범위해당 함수의 실행 구간

def greet():
    name = "Alice"  # 지역변수
    print(f"Hello, {name}")

greet()
print(name)  # 오류 발생: name은 함수 외부에서 정의되지 않음

팩트 문장: 지역변수는 안전하다. 하지만 외부와 단절된 안전함은 때론 불편하다.

전역변수란 무엇인가?


  • 전역변수(Global Variable)는 함수 밖에서 선언된 변수로, 프로그램 전체에서 접근 가능합니다.

  • 함수 내부에서 해당 변수를 수정하려면 global 키워드를 명시해야 합니다.

counter = 0  # 전역변수

def increment():
    global counter
    counter += 1

increment()
print(counter)  # 출력: 1

팩트 문장: 전역변수는 편리하다. 하지만 모든 편리함에는 대가가 있다.

전역/지역 변수 사용 시 발생하는 흔한 오류

많은 초보자들이 함수 내에서 전역변수를 수정하려고 할 때, UnboundLocalError를 만납니다. 이는 함수 내부에서 같은 이름의 지역변수를 먼저 생성해버리기 때문입니다. 파이썬은 해당 이름을 지역변수로 인식하고, 초기화되지 않은 상태에서 참조하려 하기에 오류가 발생하는 것이죠.


count = 10

def buggy():
    count += 1  # 오류 발생
    print(count)

buggy()
# UnboundLocalError: local variable 'count' referenced before assignment

팩트 문장: 전역변수라고 해서 언제든 접근 가능한 건 아니다. 선언 위치는 권한이자 한계다.

global 키워드의 역할과 사용법

함수 내부에서 전역변수를 수정하고자 할 때 반드시 global 키워드를 사용해야 합니다. 그렇지 않으면 파이썬은 새로운 지역변수를 만든 것으로 간주해 기존 전역변수를 무시하게 됩니다.

상황설명
global 키워드 미사용함수 내부에서 새로운 지역변수 생성됨
global 키워드 사용기존 전역변수를 수정 가능

score = 0

def update_score():
    global score
    score += 5

update_score()
print(score)  # 출력: 5

팩트 문장: global은 해킹처럼 강력하지만, 남용은 설계의 붕괴로 이어진다.

요약 및 변수 사용 팁


  • 지역변수를 우선 사용하고, 전역변수는 최소화하는 것이 좋다.

  • 반드시 전역변수를 수정해야 할 경우에만 global 키워드를 사용하라.

  • 변수 스코프를 정확히 이해하면 디버깅 시간이 절반으로 줄어든다.

팩트 문장: 변수는 이름이 아니라, 범위로 설계하라.

실전 팁 & 경험담: “스코프” 때문에 밤샘 디버깅한 썰

“변수가 함수 밖에서 선언됐는데 왜 함수 안에서 에러가 나는 거지?”
이 질문 하나로 저는 이틀 밤을 날렸습니다.

✔ 핵심은 이것!

파이썬에서 변수가 있다는 건 존재만을 의미하지 않습니다. 어느 스코프에 속하느냐가 행동을 결정합니다. 전역처럼 보이는 것도 함수 안에서는 지역처럼 굴 수 있습니다.

당시 저는 간단한 게임 점수 저장 로직을 짜고 있었습니다. score라는 전역변수를 선언하고, 함수 안에서 += 연산을 했는데 계속 오류가 나는 겁니다. 결국 원인은 global을 쓰지 않아서 함수 내에서 새로운 지역변수로 처리된 것이었죠.

그 이후로 저는 기본적으로 전역변수를 피하고, 필요한 경우엔 명확하게 global을 선언합니다. 또 다른 팁은 함수 내부에서 변수 값을 변경하지 말고 return으로 처리하는 것입니다. 이렇게 하면 코드의 흐름도 명확해지고 디버깅도 쉬워집니다.

“변수는 언제나 ‘무엇’이 아니라 ‘어디서’가 더 중요하다.”

전역변수와 지역변수의 가장 큰 차이점은 무엇인가요?
전역변수는 프로그램 전체에서 접근 가능한 반면, 지역변수는 함수 내에서만 유효합니다. 이는 코드의 가독성과 관리에 큰 영향을 줍니다.
전역변수를 함수 안에서 수정하려면 반드시 global을 써야 하나요?
네, 그렇습니다. global 키워드를 쓰지 않으면 파이썬은 해당 이름의 새로운 지역변수를 생성했다고 간주하여 기존 전역변수에는 영향을 주지 않습니다.
지역변수를 함수 밖에서 쓸 수 있는 방법은 없나요?
함수 내의 지역변수는 함수가 종료되면 사라지므로, 함수 외부에서 직접 사용할 수 없습니다. 반환(return)을 통해 값을 전달하는 방식이 일반적입니다.
전역변수를 많이 쓰면 안 좋은가요?
네. 전역변수는 프로그램 흐름을 복잡하게 만들고, 의도치 않은 값 변경이나 버그를 유발할 수 있습니다. 가능한 한 지역변수를 중심으로 설계하는 것이 바람직합니다.
전역변수를 피하면서도 여러 함수에서 동일한 데이터를 공유하려면 어떻게 하나요?
가장 좋은 방법은 클래스나 객체를 사용하는 것입니다. 객체 지향 프로그래밍(OOP)을 통해 상태를 관리하면, 전역변수 없이도 여러 함수에서 정보를 효과적으로 공유할 수 있습니다.

전역변수 vs 지역변수 한눈에 정리 + 추천 학습 자료


파이썬 변수 스코프 개념도


전역변수와 지역변수 차이

📎 더 깊이 알고 싶다면 참고하세요

팩트 문장: 변수의 이름보다 중요한 건 그 ‘위치’다. 스코프는 파이썬 로직의 보이지 않는 지도다.

마무리하며: 변수는 기억이 아니라 규칙으로 다뤄야 한다

변수는 프로그래밍에서 가장 기본적인 개념이지만, 전역변수와 지역변수의 경계를 이해하는 순간 코드는 완전히 달라집니다. 무의식적으로 쓰던 변수들이 언제, 어디서, 어떻게 작동하는지 알게 되면 디버깅이 쉬워지고, 실수는 현저히 줄어듭니다.

이번 글이 여러분의 파이썬 학습 여정에 스코프라는 보이지 않는 지도를 그리는 데 도움이 되었길 바랍니다. 기억하세요. 변수는 선언이 아닌, 설계입니다.

이 글이 변수에 대한 이해에 도움이 되었나요?

★★★★★

(4.9 / 5.0 기준, 181명 참여)

 


HANSORI.AI_Blog Labs에서 더 알아보기

구독을 신청하면 최신 게시물을 이메일로 받아볼 수 있습니다.