파이썬에서 변수는 값을 할당하는 순간 정의됩니다. C 언어 등 다른 언어처럼 사용하기 전에 타입과 함께 미리 선언할 필요가 없으며, 그냥 바로 사용하기 시작하면 됩니다.
x = 141
파일이나 모듈의 최상위 레벨에서 선언된 변수는 전역 범위(global scope)에 속하며, 함수 내부에서도 접근할 수 있습니다.
다만 좋은 코드를 위해 기억해야 할 원칙이 있습니다. 변수는 자신의 역할을 수행하는 데 필요한 가장 좁은 범위(narrowest scope)를 가져야 한다는 것입니다. 불필요하게 전역 변수를 남발하면 코드의 예측 가능성과 유지보수성이 떨어지기 때문입니다.
예제: 지역 변수와 전역 변수
다음 코드를 살펴보겠습니다.
x = 141
def foo():
x = 424 # 지역 변수
print(x)
foo()
print(x)출력 결과
424 141
동작 설명
foo 함수 내부에서 x에 424를 할당하면, 실제로는 그 함수의 지역 범위(local scope)에 새로운 지역 변수 x를 선언하는 것입니다. 이 지역 변수 x는 전역 범위의 x와는 아무런 관계가 없는 완전히 별개의 변수입니다.
함수가 종료되면 값이 424였던 지역 변수는 소멸합니다. 따라서 마지막 print(x) 문이 실행될 때는 전역 변수 x의 값인 141이 그대로 출력되는 것입니다.
global 키워드로 전역 변수 수정하기
만약 함수 내부에서 전역 변수의 값을 유지하거나 변경하고 싶다면 global 키워드를 사용해야 합니다.
x = 141
def foo():
global x
x = 424
print(x)
foo()
print(x)출력 결과
424 424
global x 선언 덕분에 함수 내부의 x는 지역 변수가 아니라 전역 변수 x를 가리키게 됩니다. 따라서 함수 안에서 424를 할당하면 전역 변수의 값 자체가 변경되고, 함수 종료 후에도 그 값이 유지됩니다.
추가 팁: 중첩 함수에는 nonlocal 사용
함수 안에 또 다른 함수가 정의된 경우(중첩 함수), 바깥 함수의 지역 변수를 참조해야 한다면 nonlocal 키워드를 사용할 수 있습니다. 정리하면 파이썬은 이름을 찾을 때 지역 → 둘러싼 범위 → 전역 → 내장(built-in) 순서(LEGB 규칙)로 탐색하며, global과 nonlocal 키워드는 이 기본 규칙을 명시적으로 벗어나 상위 범위의 변수에 접근하게 해주는 도구입니다.