지역 변수(Local Variable)와 전역 변수(Global Variable): 변수의 유효 범위
1. 서론: 변수, 어디까지 영향을 미칠까?
지금까지 우리는 파이썬에서 변수를 선언하고 값을 할당하며, 함수를 통해 데이터를 주고받는 방법을 배웠습니다. 그런데 변수는 프로그램 코드의 모든 곳에서 자유롭게 사용될 수 있을까요? 예를 들어, 함수 안에서 정의된 변수가 함수 밖에서도 접근 가능한지, 또는 함수 밖에서 정의된 변수를 함수 안에서 변경할 수 있는지와 같은 의문이 생길 수 있습니다. 이러한 의문은 ‘변수의 유효 범위(Scope)’라는 개념과 관련이 있습니다. 변수의 유효 범위는 변수가 코드의 어느 부분에서 접근 가능하고 유효한지를 결정합니다. 파이썬에서는 변수의 유효 범위를 크게 ‘지역 변수(Local Variable)’와 ‘전역 변수(Global Variable)’로 나눌 수 있습니다. 이 챕터에서는 변수의 유효 범위 개념을 명확히 이해하고, 지역 변수와 전역 변수의 차이점, 그리고 global 키워드를 사용하여 전역 변수를 함수 내에서 변경하는 방법에 대해 깊이 있게 알아보겠습니다. 변수의 유효 범위를 마스터하는 것은 여러분의 파이썬 코드를 더욱 체계적이고 오류 없이 관리하는 데 필수적인 단계가 될 것입니다.
2. 변수의 유효 범위 (Scope)
변수의 유효 범위는 변수가 선언된 위치에 따라 결정되며, 해당 변수에 접근할 수 있는 코드 영역을 의미합니다. 파이썬에서 변수의 유효 범위는 주로 함수와 클래스(나중에 배울 개념)에 의해 결정됩니다.
2.1. 지역 변수 (Local Variable)
지역 변수는 함수 내부에서 정의된 변수입니다. 지역 변수는 해당 함수 내에서만 유효하며, 함수가 호출될 때 생성되고 함수 실행이 끝나면 소멸됩니다. 함수 외부에서는 지역 변수에 접근할 수 없습니다.
def my_function():
local_var = 10 # my_function 내부에서 정의된 지역 변수
print(f"함수 내부: local_var = {local_var}")
my_function()
# 출력: 함수 내부: local_var = 10
# print(local_var) # NameError: name 'local_var' is not defined
# 함수 외부에서는 local_var에 접근할 수 없습니다.
2.2. 전역 변수 (Global Variable)
전역 변수는 함수 외부, 즉 프로그램의 최상위 레벨에서 정의된 변수입니다. 전역 변수는 프로그램의 어느 곳에서든 접근할 수 있으며, 프로그램이 종료될 때까지 유효합니다.
global_var = 20 # 함수 외부에서 정의된 전역 변수
def another_function():
print(f"함수 내부에서 전역 변수 접근: global_var = {global_var}")
another_function()
# 출력: 함수 내부에서 전역 변수 접근: global_var = 20
print(f"함수 외부에서 전역 변수 접근: global_var = {global_var}")
# 출력: 함수 외부에서 전역 변수 접근: global_var = 20
3. 지역 변수와 전역 변수의 상호작용
3.1. 함수 내에서 전역 변수 읽기
함수 내부에서는 전역 변수를 직접 읽을 수 있습니다. 파이썬은 변수를 찾을 때 ‘LEGB 규칙’을 따릅니다. (Local -> Enclosing function locals -> Global -> Built-in)
global_message = "나는 전역 변수입니다."
def read_global():
print(global_message) # 함수 내부에서 전역 변수 읽기
read_global()
# 출력: 나는 전역 변수입니다.
3.2. 함수 내에서 전역 변수와 동일한 이름의 지역 변수 정의
함수 내부에서 전역 변수와 동일한 이름의 변수를 정의하면, 해당 변수는 지역 변수로 간주됩니다. 이 지역 변수는 함수 내부에서만 유효하며, 함수 외부의 전역 변수에는 영향을 미치지 않습니다.
x = 10 # 전역 변수 x
def modify_x_locally():
x = 20 # 함수 내부에서 정의된 지역 변수 x
print(f"함수 내부 (지역 x): {x}")
modify_x_locally()
# 출력: 함수 내부 (지역 x): 20
print(f"함수 외부 (전역 x): {x}") # 전역 변수 x는 변경되지 않았습니다.
# 출력: 함수 외부 (전역 x): 10
이것은 매우 중요한 개념입니다. 함수 내부에서 변수에 값을 할당하면, 파이썬은 기본적으로 그 변수를 지역 변수로 간주합니다. 따라서 함수 내부에서 전역 변수의 값을 변경하고 싶다면 특별한 방법을 사용해야 합니다.
4. global 키워드: 함수 내에서 전역 변수 변경하기
함수 내부에서 전역 변수의 값을 변경하려면 global 키워드를 사용해야 합니다. global 키워드는 파이썬 인터프리터에게 해당 변수가 지역 변수가 아니라 전역 변수임을 명시적으로 알려줍니다.
count = 0 # 전역 변수 count
def increment_global_count():
global count # count가 전역 변수임을 선언
count += 1 # 전역 변수 count의 값을 변경
print(f"함수 내부 (전역 count): {count}")
print(f"함수 호출 전 (전역 count): {count}") # 출력: 함수 호출 전 (전역 count): 0
increment_global_count()
# 출력: 함수 내부 (전역 count): 1
increment_global_count()
# 출력: 함수 내부 (전역 count): 2
print(f"함수 호출 후 (전역 count): {count}") # 출력: 함수 호출 후 (전역 count): 2
4.1. global 사용 시 주의사항
- 남용 금지:
global키워드를 너무 자주 사용하는 것은 좋지 않은 프로그래밍 습관으로 간주됩니다. 전역 변수를 남용하면 코드의 흐름을 추적하기 어렵고, 예상치 못한 부작용(side effect)을 일으킬 수 있어 유지보수가 어려워집니다. 가능한 한 함수는 매개변수를 통해 값을 받고 반환 값을 통해 결과를 돌려주는 방식으로 독립적으로 동작하도록 설계하는 것이 좋습니다. - 선언 위치:
global키워드는 변수를 사용하기 전에 함수 내에서 선언되어야 합니다.
5. nonlocal 키워드 (중첩 함수에서 사용)
nonlocal 키워드는 중첩 함수(함수 안에 정의된 함수)에서 바깥쪽 함수의 지역 변수를 변경할 때 사용됩니다. global이 전역 변수를 다루는 반면, nonlocal은 가장 가까운 바깥쪽(enclosing) 스코프의 변수를 다룹니다.
def outer_function():
outer_var = 10 # outer_function의 지역 변수
def inner_function():
nonlocal outer_var # outer_function의 outer_var를 참조
outer_var += 1
print(f"내부 함수: outer_var = {outer_var}")
inner_function()
print(f"외부 함수: outer_var = {outer_var}")
outer_function()
# 출력:
# 내부 함수: outer_var = 11
# 외부 함수: outer_var = 11
6. LEGB 규칙: 파이썬의 변수 탐색 순서
파이썬은 변수를 찾을 때 다음과 같은 순서로 유효 범위를 탐색합니다. 이를 LEGB 규칙이라고 합니다.
- L (Local): 현재 함수 내의 지역(Local) 스코프
- E (Enclosing function locals): 중첩된 함수가 있을 경우, 바깥쪽(Enclosing) 함수의 지역 스코프
- G (Global): 모듈의 최상위 레벨에 정의된 전역(Global) 스코프
- B (Built-in): 파이썬에 내장된 이름(예:
print,len,True,False등) 스코프
변수를 참조할 때 이 순서대로 찾고, 변수를 할당할 때는 기본적으로 현재 스코프(Local)에 새로운 변수를 생성합니다. global이나 nonlocal 키워드를 사용해야만 이 기본 동작을 변경하여 바깥 스코프의 변수를 변경할 수 있습니다.
7. 결론: 변수 유효 범위의 명확한 이해
이 챕터를 통해 여러분은 파이썬 변수의 유효 범위(Scope) 개념과 지역 변수, 전역 변수의 차이점, 그리고 global 키워드를 사용하여 전역 변수를 함수 내에서 변경하는 방법에 대해 깊이 있게 학습했습니다. 또한, 중첩 함수에서 바깥쪽 함수의 지역 변수를 다루는 nonlocal 키워드와 파이썬의 변수 탐색 순서인 LEGB 규칙까지 살펴보았습니다.
변수의 유효 범위를 명확히 이해하는 것은 코드의 예측 가능성을 높이고, 예상치 못한 오류를 방지하며, 프로그램을 더욱 체계적으로 관리하는 데 필수적입니다. 전역 변수의 남용은 코드의 복잡성을 증가시키고 디버깅을 어렵게 만들 수 있으므로, 가능한 한 함수는 독립적으로 동작하도록 설계하고, 필요한 데이터는 매개변수를 통해 전달받고 반환 값을 통해 돌려주는 방식을 선호하는 것이 좋습니다.
이제 여러분은 파이썬의 핵심적인 개념인 변수의 유효 범위까지 마스터했습니다. 다음 챕터에서는 파이썬의 간결한 익명 함수인 ‘람다(Lambda) 함수’에 대해 알아보겠습니다. 람다 함수는 간단한 작업을 수행하는 함수를 한 줄로 표현할 때 유용하게 사용됩니다. 오늘 배운 변수의 유효 범위 개념을 바탕으로 다양한 함수를 직접 만들어 보면서, 여러분의 파이썬 실력을 더욱 단단하게 다지세요!
