Python에서 nonlocal
과 global
키워드는 변수를 참조하거나 수정할 때, 그 변수의 범위(scope)를 명시적으로 지정하는 데 사용된다. 이 두 키워드는 주로 함수 내에서 사용되며, 함수 내부에서 변수의 값을 읽거나 수정할 때 어느 범위의 변수를 참조할지 결정하는 중요한 역할을 한다.
1. 변수의 범위(Scope)
먼저 Python에서 변수의 범위(scope)를 이해하는 것이 중요하다. Python에는 네 가지 주요 범위가 있다.
- Local Scope (지역 범위): 함수 내부에서 정의된 변수. 이 변수는 해당 함수 내에서만 접근할 수 있다.
- Enclosing Scope (내포 범위): 중첩된 함수에서 바깥 함수의 변수. 중첩된 함수가 이 변수를 참조할 수 있다.
- Global Scope (전역 범위): 함수 밖에서 정의된 변수. 이 변수는 모듈 전체에서 접근할 수 있다.
- Built-in Scope (내장 범위): Python에서 기본으로 제공하는 내장 함수 및 예외 같은 것들이 포함된 범위.
이제 nonlocal
과 global
키워드를 통해 각 범위에서 변수를 어떻게 참조하고 수정할 수 있는지 알아보자.
2. global
키워드
global
키워드란?
global
키워드는 함수 내부에서 전역 변수를 참조하거나 수정할 때 사용된다. 기본적으로, 함수 내부에서 변수를 정의하면 해당 변수는 지역 변수로 취급되며, 함수 외부의 전역 변수와는 다른 별개의 변수가 된다. 그러나 global
키워드를 사용하면 함수 내부에서 전역 변수를 직접 수정할 수 있다.
global
사용 예제
x = 10 # 전역 변수
def modify_global():
global x # 전역 변수 x를 참조
x = 20 # 전역 변수 x를 수정
modify_global()
print(x) # 20 출력
위 코드에서 global x
는 함수 modify_global
내에서 x
변수를 전역 변수로 취급하게 만든다. 따라서 함수 내부에서 x
의 값을 20으로 수정하면, 전역 범위의 x
값이 변경된다.
global
의 활용
global
키워드는 다음과 같은 상황에서 유용하다.
- 전역 변수 수정: 함수 내부에서 전역 변수의 값을 변경해야 할 때
- 상태 유지: 프로그램의 상태를 전역 변수로 유지해야 할 때
3. nonlocal
키워드
nonlocal
키워드란?
nonlocal
키워드는 중첩된 함수(내부 함수)에서 바깥 함수의 변수를 참조하거나 수정할 때 사용된다. 기본적으로, 내부 함수에서 변수를 정의하면 해당 변수는 내부 함수의 지역 변수가 된다. 그러나 nonlocal
키워드를 사용하면 내부 함수에서 바깥 함수의 변수를 참조하거나 수정할 수 있다.
nonlocal
사용 예제
def outer_function():
y = 5 # 외부 함수 변수
def inner_function():
nonlocal y # 바깥 함수의 y를 참조
y = 10 # 바깥 함수의 y를 수정
inner_function()
print(y) # 10 출력
outer_function()
위 코드에서 nonlocal y
는 inner_function
이 outer_function
의 y
변수를 참조하게 만든다. 따라서 inner_function
에서 y
의 값을 10으로 변경하면, 바깥 함수의 y
값이 변경된다.
nonlocal
의 활용
nonlocal
키워드는 다음과 같은 상황에서 유용하다.
- 클로저(Closure)에서 상태 유지: 클로저에서 바깥 함수의 상태를 유지하고 싶을 때
- 중첩 함수 간 데이터 공유: 중첩 함수들이 공통된 변수를 공유해야 할 때
4. global
과 nonlocal
의 차이점
global
과 nonlocal
은 변수의 범위를 지정하는 데 사용된다는 점에서 비슷하지만, 사용하는 상황과 작동 방식에 차이가 있다.
- 적용 범위:
global
: 전역 변수를 참조하거나 수정할 때 사용된다.nonlocal
: 중첩 함수에서 바깥 함수의 변수를 참조하거나 수정할 때 사용된다.
- 사용 위치:
global
: 함수 내에서 전역 변수를 수정하고자 할 때 사용된다.nonlocal
: 중첩된 함수에서 바깥 함수의 변수를 수정하고자 할 때 사용된다.
- 상태 관리:
global
: 프로그램 전체의 상태를 전역 변수를 통해 관리할 때 유용하다.nonlocal
: 함수 내부에서 특정 상태를 유지하거나 공유할 때 유용하다.
5. 주의사항 및 권장사항
주의사항
- 가독성 저하: 전역 변수나
nonlocal
변수를 많이 사용하면 코드의 가독성이 떨어질 수 있다. 특히,global
키워드를 남용하면 코드의 상태를 추적하기 어려워진다. - 의도하지 않은 수정:
global
과nonlocal
을 잘못 사용하면 의도치 않게 변수를 수정할 수 있다. 이는 디버깅을 어렵게 만든다.
권장사항
- 최소한의 사용: 가능한 한
global
과nonlocal
키워드의 사용을 최소화하고, 지역 변수를 사용하는 것을 권장한다. 전역 변수나 바깥 함수의 변수를 사용하지 않아도 되는 상황에서는 사용하지 않는 것이 좋다. - 명확한 변수명: 전역 변수나
nonlocal
변수를 사용할 때는 명확한 변수명을 사용하여 혼동을 피하고, 코드의 가독성을 유지해야 한다.