프로그램 안에 선언된 모든 변수가 코드의 어느 위치에서든 접근할 수 있는 것은 아닙니다. 변수에 접근할 수 있는지는 그 변수를 어디에서 선언했는가에 따라 달라집니다.
이처럼 특정 식별자(변수 이름)에 접근할 수 있는 프로그램상의 영역을 스코프(scope, 범위)라고 하며, Python에서는 변수의 스코프를 크게 두 가지로 구분합니다.
- 전역 변수(Global Variable)
- 지역 변수(Local Variable)
전역 변수 vs 지역 변수
두 스코프의 차이는 선언 위치에 따라 결정됩니다.
- 지역 변수: 함수 본문 안쪽에서 정의된 변수로, 해당 함수 내부에서만 접근할 수 있습니다.
- 전역 변수: 함수 본문 바깥쪽(모듈 최상위 레벨)에서 정의된 변수로, 프로그램 전체의 모든 함수에서 접근할 수 있습니다.
즉, 지역 변수는 자신이 선언된 함수 안에서만 유효하며, 함수를 호출하는 순간 그 함수 내부에 선언된 변수들이 스코프에 포함됩니다. 반면 전역 변수는 프로그램 어디에서든 읽을 수 있습니다.
예제 코드
다음 예제는 같은 이름의 total 변수가 함수 안과 밖에서 어떻게 다르게 동작하는지 보여줍니다.
#!/usr/bin/python3
total = 0 # 이것은 전역 변수입니다.
# 함수 정의
def sum(arg1, arg2):
# 두 매개변수를 더한 값을 반환합니다.
total = arg1 + arg2 # 여기서 total은 지역 변수입니다.
print("함수 내부의 지역 total :", total)
return total
# sum 함수 호출
sum(10, 20)
print("함수 외부의 전역 total :", total)실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
함수 내부의 지역 total : 30 함수 외부의 전역 total : 0
결과 해석
결과가 다르게 나타나는 이유는 다음과 같습니다.
- 함수
sum()내부에서total = arg1 + arg2문장은 새로운 지역 변수total을 생성합니다. 따라서 함수 안에서 출력되는 값은 30입니다. - 반면 함수 외부의
total은 처음에 선언한 전역 변수로, 함수 내부의 할당과는 무관하게 초기값 0을 그대로 유지합니다.
참고: global 키워드
만약 함수 내부에서 전역 변수 자체를 수정하고 싶다면 global 키워드를 사용해야 합니다.
total = 0
def sum(arg1, arg2):
global total # 전역 변수임을 명시
total = arg1 + arg2 # 이제 전역 변수를 수정
return total
sum(10, 20)
print(total) # 출력: 30이처럼 Python의 스코프 규칙을 정확히 이해하면, 의도치 않은 변수 충돌이나 값 덮어쓰기 버그를 예방하고 더 깔끔한 코드를 작성할 수 있습니다.