프로그래밍 개발 공부

[Python 학습] 2-10 분명 만들었는데 왜 없지? 지역 변수와 전역 변수 (Scope 완벽 이해)

wikys 2026. 7. 27. 10:58
코딩을 처음 배우고 파이썬에서 함수(Function)를 작성할 때쯤, 누구나 한 번쯤 마주하는 황당한 에러가 있습니다. 분명 함수 안에서 변수를 열심히 만들고 값을 넣었는데, 함수 밖에서 그 변수를 출력하려고 하면 "그런 변수는 없다"라며 에러가 발생합니다. 또한, 함수 밖과 안에 똑같은 이름의 변수를 썼는데 값이 내 마음대로 바뀌지 않아 당황하는 상황도 자주 발생하죠.
"내가 만든 변수는 도대체 어디로 사라진 걸까?"라는 고민, 해보신 적 있으신가요? 이것은 파이썬 프로그래밍의 핵심 개념 중 하나인 '변수의 유효 범위(Scope)'를 아직 낯설어하기 때문입니다. 오늘은 변수의 이름이 어디까지 살아남고 어떻게 동작하는지, 파이썬 Scope의 원리를 쉽고 명확하게 파헤쳐 보겠습니다.

📌 1. 변수의 범위(Scope)란 정확히 무엇일까?
변수는 한 번 만들면 프로그램 전체에서 마음대로 쓸 수 있는 것이 아닙니다. 파이썬에서 변수는 '만들어진 위치'에 따라 그 이름을 부르고 찾을 수 있는 영역이 엄격하게 정해져 있습니다. 즉, Scope란 변수의 값 자체라기보다는 '변수의 이름이 유효한 범위'를 뜻합니다.
컴퓨터는 코드를 실행할 때 현재 위치에서 그 변수의 이름을 찾을 수 있는지(LEGB 규칙 등)를 확인하여 작동합니다. 범위를 나누어두면 코드를 기능별로 분리했을 때 서로 엉키는 것을 막아주는 든든한 보호막 역할을 합니다.

📌 2. 함수 안의 메모장 '지역 변수' vs 공용 게시판 '전역 변수'
변수의 범위는 크게 두 가지로 나눌 수 있습니다.
  • 지역 변수(Local Variable) : 함수 안에서 만들어지고 사용되는 변수입니다. 함수라는 '독립된 회의실' 안에서만 사용하는 임시 메모장과 같습니다. 해당 함수가 실행되는 동안에만 존재하며, 함수가 종료되면 메모장도 폐기되므로 바깥에서는 그 이름을 부를 수 없습니다. 우리가 함수에 넘겨주는 매개변수 역시 함수 안에서만 쓰이는 지역 변수에 속합니다.
  • 전역 변수(Global Variable) : 함수 바깥(보통 코드 최상단)에서 만들어진 변수입니다. 회사 로비에 있는 '공용 게시판'처럼 어떤 함수에서든 들여다볼 수 있고 넓은 범위에서 유효합니다.

📌 3. 초보자가 가장 많이 헷갈리는 함정 2가지
초보자 파이썬 scope 학습에서 가장 많이 부딪히는 두 가지 오해를 짚어보겠습니다.
① 동명이인 주의 (파이썬 변수 이름 충돌) 함수 밖의 전역 변수와 함수 안의 지역 변수 이름을 똑같이 지으면 어떻게 될까요? 파이썬은 이 둘을 범위가 다른 별개의 변수로 취급합니다. 즉, 함수 안에서 변수에 새로운 값을 대입하더라도 그것은 새로운 지역 변수를 만든 것일 뿐, 밖에 있는 동명이인의 전역 변수 값은 변하지 않습니다.
② 읽기는 되는데 왜 수정이 안 될까? (UnboundLocalError) 함수 안에서 전역 변수를 그저 읽기만 하는 것은 문제없이 가능합니다. 하지만 함수 안에서 전역 변수와 같은 이름에 새로운 값을 계산해서 대입(=)하려고 시도하면, 파이썬은 기본적으로 그것을 '새로운 지역 변수를 만들려는 행동'으로 해석합니다. 그 결과, 지역 변수에 값이 채 정해지기도 전에 변수를 사용했다며 예상치 못한 에러(UnboundLocalError)를 뱉어내게 됩니다.

📌 4. global 키워드는 만능 해결사일까? (전역 변수 사용 주의)
그렇다면 함수 안에서 전역 변수의 값을 직접 바꾸려면 어떻게 해야 할까요? 파이썬에서는 global 키워드를 제공합니다. 함수 내부에서 "이 변수는 전역 변수야!"라고 선언하면, 함수 안에서도 공용 게시판의 내용을 직접 수정할 수 있게 됩니다.
하지만 실무와 개발 현장에서는 global 사용을 최대한 피하라고 강력히 권고합니다. 왜 그럴까요? 함수가 외부의 전역 상태를 함부로 바꾸면, 코드가 길어질수록 값이 어디서 변했는지 에러를 추적하기 힘든 스파게티 코드가 되기 때문입니다.
  • 올바른 활용 방향 : 코드를 예측 가능하게 만들려면 전역 변수를 직접 조작하는 대신, 필요한 값을 함수의 매개변수(Parameter)로 넘겨받고 처리된 결과는 return으로 돌려주는 구조를 사용하는 것이 훨씬 안전하고 명확합니다.

📌 5. 주의점 : 리스트와 딕셔너리의 가변 객체 (Mutable Trap)
단순한 숫자나 문자열이 아니라, 리스트(List)나 딕셔너리(Dictionary) 같은 '가변 객체(Mutable Type)'를 다룰 때는 예외적인 상황에 주의해야 합니다. 가변 객체는 global 키워드 없이도 함수 내부에서 내용물(예: x = 1)을 직접 변경하면, 밖의 전역 변수 원본에도 수정 사항이 그대로 반영됩니다. 이는 파이썬이 객체의 값을 복사하는 것이 아니라 동일한 '참조(Reference)'를 넘기기 때문입니다. 의도치 않은 데이터 변경을 막으려면 사본(Copy)을 만들어 활용하는 등 신중하게 코드를 짜야 합니다.

✨ 마무리하며
변수의 유효 범위를 이해하는 것은 단순한 문법 규칙 하나를 외우는 것에 그치지 않습니다. 그것은 코드가 서로 엉키지 않게 영향 범위를 꼼꼼하게 관리하고, 각각의 함수를 독립적이고 안전한 기능 단위로 설계하는 감각을 기르는 일입니다.
오늘 배운 파이썬 지역 변수와 전역 변수의 개념이 어느 정도 잡히셨다면, 다음 단계로는 여러 기능을 파일 단위로 나누어 관리하고 다른 파일의 기능을 불러오는 '모듈(Module)과 import'에 대해 학습해보시는 것을 적극 추천합니다! 잘 설계된 범위 관리로 여러분의 체력과 디버깅 시간을 획기적으로 아껴보시길 바랍니다.

 

반응형