Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬(Python) 모듈에서 변수 범위(스코프)는 어떻게 작동할까?

네임스페이스와 스코프의 관계

파이썬에서 네임스페이스(Namespace)는 스코프(scope)를 구현하는 핵심 메커니즘입니다. 패키지, 모듈, 클래스, 함수, 메서드 각각은 자신만의 네임스페이스를 가지며, 변수 이름은 이 네임스페이스 안에서 해석(resolve)됩니다.

함수나 모듈, 패키지가 평가되어 실행을 시작하면 새로운 네임스페이스가 생성됩니다. 이를 일종의 '실행 컨텍스트(evaluation context)'라고 생각하면 이해하기 쉽습니다. 그리고 함수 등의 실행이 끝나면 해당 네임스페이스는 사라지고, 그 안에 있던 변수들도 함께 소멸합니다.

변수는 기본적으로 지역(local) 네임스페이스에만 생성됩니다. 만약 다른 범위에 변수를 만들고 싶다면 global 문이나 nonlocal 문을 사용해야 합니다.

스코프 결정과 LEGB 규칙

코드에서 변수를 사용할 때, 파이썬은 그 값이 어디에서 와야 하는지를 판단해야 합니다. 이 과정을 스코프 결정(scope resolution)이라고 하며, 파이썬은 이를 위해 LEGB 규칙을 따릅니다.

L — Local (지역)

함수(또는 람다) 내부에서 어떤 방식으로든 할당된 이름 중, 그 함수 안에서 global로 선언되지 않은 이름입니다.

E — Enclosing-function locals (둘러싼 함수의 지역)

내부에서 외부 방향으로, 정적으로 둘러싸고 있는 모든 함수(또는 람다)의 지역 스코프에 있는 이름입니다.

G — Global (모듈 전역)

모듈 파일의 최상위 레벨에서 할당된 이름, 또는 해당 파일 내부의 def 안에서 global 문을 실행하여 할당된 이름입니다.

B — Built-in (내장)

내장 이름 모듈(builtins)에 미리 정의되어 있는 이름으로, open, range, SyntaxError 등이 여기에 속합니다.

간단한 예시

x = 'global'          # G: 모듈 전역 스코프

def outer():
    x = 'enclosing'   # E: 둘러싼 함수 스코프
    def inner():
        x = 'local'   # L: 지역 스코프
        print(x)      # 'local' 출력
    inner()

outer()
print(x)              # 'global' 출력

위 예시처럼 파이썬은 이름을 찾을 때 Local → Enclosing → Global → Built-in 순서로 탐색하며, 가장 먼저 발견된 값을 사용합니다.