파이썬 프로그램에서 변수는 선언된 위치에 따라 서로 다른 스코프(scope, 유효 범위)를 가집니다. 변수가 어디에 선언되었는가에 따라 함수 내부에서 접근할 수 있기도 하고 그렇지 못하기도 하는데, 때로는 현재 스코프 바깥에서 함수 내부의 변수를 수정해야 할 필요가 생깁니다. 이런 상황에서 global 키워드를 변수 이름과 함께 사용하면 됩니다.
global 키워드의 핵심 포인트
- 함수 밖에서 선언된 변수는 기본적으로 전역 변수(global variable)입니다.
- 함수 내부의 변수를 수정하고 싶다면 해당 변수에
global키워드를 선언해야 합니다. global키워드 없이 함수 내부에서 선언된 변수는 기본적으로 지역 변수(local variable)입니다.
global 없이 전역 변수 수정 시도
먼저 global 키워드 없이 함수 내부에서 전역 변수를 수정하려 하면 어떤 일이 발생하는지 확인해 보겠습니다. 아래 예제에서는 함수 안에서 전역 변수 var의 값을 변경하려고 시도하지만, 파이썬은 이를 허용하지 않아 오류가 발생합니다.
예제
var = 321
# 변수를 수정하는 함수
def modify():
var = var * 2
print(var)
# 함수 호출
modify()
실행 결과
UnboundLocalError: local variable 'var' referenced before assignment
함수 내부에 var에 값을 할당하는 문장이 존재하면, 파이썬은 var를 지역 변수로 취급합니다. 그런데 값이 할당되기 전에 var * 2 연산으로 var를 먼저 참조했기 때문에 UnboundLocalError가 발생하는 것입니다.
global 키워드 사용하기
이번에는 함수 내부에서 변수를 선언할 때 global 키워드를 함께 사용해 보겠습니다. 이렇게 하면 해당 변수는 전역 변수로 취급되어 자유롭게 수정할 수 있습니다.
예제
var = 321
# 변수를 수정하는 함수
def modify():
global var
var = var * 2
print(var)
# 함수 호출
modify()
실행 결과
642
global var 선언 덕분에 함수 내부의 var는 전역 변수를 가리키게 되고, 값이 2배인 642로 성공적으로 변경됩니다.
중첩 함수에서 global 사용하기
중첩 함수(nested function) 구조에서는 변수를 실제로 수정하는 가장 안쪽 함수에 global 키워드를 선언해야 합니다. 그래야 해당 변수가 전역 변수로 인식되어 수정할 수 있습니다.
예제
var = 321
def outer_func():
# 변수를 수정하는 내부 함수
def modify():
global var
var = var * 2
print(var)
modify()
outer_func()
print(var)
실행 결과
642 642
내부 함수 modify()에서 global var를 선언했기 때문에 전역 변수 var가 642로 변경되었으며, 함수 호출이 끝난 뒤에도 변경된 값이 그대로 유지됩니다.
참고로, 모듈 수준의 전역 변수가 아니라 바깥쪽(둘러싸는) 함수의 지역 변수를 중첩 함수에서 수정하려면 nonlocal 키워드를 사용해야 합니다. global은 전역 변수에, nonlocal은 한 단계 바깥 함수의 지역 변수에 적용된다는 점을 기억해 두면 좋습니다.