지난 시간에 배운 함수를 사용하다 보면 다음과 같은 상황이 발생할 수 있습니다.
num = 5
def make_ten():
num = 10
print(num)
print(num)
# 결과
# 10
# 5
위의 코드를 보면, make_ten이라는 함수로 함수 밖의 num을 10으로 만들고 출력을 한 것처럼 보입니다. 하지만 함수가 끝나고 다시 num을 출력해보니 이전과 같은 5가 출력되었습니다. 이게 어떻게 된 일일까요?
이에 대한 답을 알기 위해서는 지역변수와 전역변수에 대해 알 필요가 있습니다.
파이썬에서는 변수의 범위(scope)가 존재합니다. 즉, 변수가 활동할 수 있는 범위가 있다는 것이죠. 지역변수와 전역변수는 그 범위의 차이로 구분할 수 있습니다.
지역변수는 특정 코드 블럭 내에서 선언되어 그 블럭이 끝나면 사라지는 변수입니다. 대표적으로 함수 내에서 선언한 변수가 있죠. 함수 내에서 선언한 변수나 매개변수가 지역변수에 해당합니다.
def add(a, b):
# 매개변수인 a, b와 함수 내에서 선언된 result는 모두 지역변수입니다.
result = a + b
return result
반면, 전역변수는 프로그램의 시작부터 끝까지 존재하는 변수로, 프로그램의 어떤 요소든 해당 변수에 접근이 가능하다는 특징을 가지고 있습니다. 우리가 흔히 선언하는 변수들이 전역 변수에 해당합니다.
a = 1 # 전역변수입니다.
그렇다면 맨 처음의 코드를 다시 보도록 하죠. num을 출력했을 때 기존값인 5가 출력된 이유는 이때의 num은 전역변수였기 때문입니다. 즉, make_ten() 함수 내의 num은 전역변수 num과 이름이 같을 뿐인 지역변수인거죠. 첫번째 출력에서는 함수 내였기 때문에 지역변수 num의 값인 10이 출력되지만, 두번째 출력에서는 지역변수 num은 make_ten()이 종료됨과 동시에 사라지고, 전역변수 num이 출력됩니다.
만약 처음 코드와 같은 함수 내에서 전역변수를 쓰고 싶을 때는 어떻게 해야할까요? 함수 내에서 전역변수를 변경하면 지역변수로 인식되어서 함수가 끝나면 영향을 주지 않는데 말이죠. 때문에 파이썬에서는 global
키워드를 통해 전역변수를 사용한다고 명시합니다.
a = 10
def make_ten():
global a # 전역변수 a를 사용한다고 명시
a = 10
print(a)
print(a)
# 결과
# 10
# 10
다음 코드를 보면, global a
을 통해 전역변수 a를 가져와 값을 변경한 것을 확인할 수 있습니다. 때문에 함수 내에서 a를 출력한 결과와 함수 밖에서 a를 출력한 결과가 같죠.
global 키워드는 함수 밖에서 전역변수를 가져오는 것 이외에도, 함수 안에서 전역변수를 만들 때도 사용됩니다.
def make_ten():
global a
a = 10
print(a)
make_ten()
print(a)
# 결과
# 10
# 10
위의 코드와 같이 global 키워드를 사용하여 함수 내에서 전역변수 a를 만든 뒤, 함수 밖에서 출력하는 등의 작업을 할 수 있습니다. 함수 밖에 a는 없지만 함수 내에서 전역변수로 선언했기 때문에 10이 출력되죠.
❗ 중요 포인트
global 키워드는 선언 후 바로 값을 줄 수 없습니다.
즉, global a = 10과 같은 문장은 오류가 발생한다는 뜻이죠.