Skip to content

파이썬 scope #

Find similar titles

1회 업데이트 됨.

Edit
  • 최초 작성자
  • 최근 업데이트
    shlee

Structured data

Category
Programming

스코프 #

많은 프로그래밍 언어에서는 변수가 선언된 위치에 따라 해당 변수가 영향을 미치는 범위가 달라지며, 이를 보통 스코프라고 한다. 파이썬에서도 변수가 선언된 위치, 영향을 끼치는 범위에 따라 각 영역을 구분하며 LEGB의 룰을 지키게 된다.

LEGB #

LEGB는 Local, Enclosing, Global, Built-in의 4가지 영역을 가리킨다. LEGB라는 룰은 파이썬에서 변수를 참조할 때 참조하는 영역의 순서를 가리킨다. 이 영역은 어디를 기준으로 보는지에 따라 달라진다.

f = 10
def outer(a: int, b: int) -> None:
    c = a + b
    def inner(n: int) -> int:
        d = 10 + e # 기준
        print(d)
        return c + n

위의 코드에서 각 영역을 확인해보자.

Local #

기준이라고 주석이 달린 라인을 기준으로 보았을 때 먼저 변수 n, d는 Local 스코프에 위치하며 자유롭게 참조할 수 있고 바라보는 객체를 바꾸는 등의 동작이 가능하다.

Enclosing #

a, b, c는 기준이 되는 함수의 밖의 함수인 Enclosing 스코프에 위치하며 파이썬에서는 기본적으로 변수를 참조할 때 지역 변수라고 생각하고 참조하므로 값을 기준이 되는 영역에서 값을 읽을 수는 있으나 해당 변수가 가리키는 주소를 바꾸는 등의 동작은 불가능하다. 만약 Local 스코프에서 Enclosing 스코프에 존재하는 변수가 가리키는 주소를 변경하고 싶다면 nonlocal 키워드를 통해서 접근할 수 있다.

Global #

f는 함수 내부가 아닌 Global 스코프에 위치하며 Local, Enclosing 등 모든 영역에서 참조할 수 있다. Local에서는 Enclosing과 마찬가지고 값을 읽을 수는 있으나 해당 변수가 가리키는 주소를 바꿀 수는 없다. 만약 Global 스코프에 존재하는 변수가 가리키는 주소를 변경하고 싶다면 global 키워드를 통해서 접근할 수 있다.

Built-in #

기본적으로 내장함수 등이 위치하는 영역을 가리키며 print, map, filter 등의 함수들이 정의되어 있고 모든 영역에서 참조할 수 있다.

Mutable #

List, Dict, Set과 같은 Mutable 객체들은 nonlocal, global 키워드 없이도 외부 스코프의 변수를 참조하여 값을 변경할 수 있는데 이는 해당 객체의 값을 변경할 때는 변수가 가진 주소가 가리키는 힙 영역에 저장된 객체의 값을 바꾸는 것이고 해당 변수가 가리키는 주소가 변경되는 것이 아니기 때문이다. 만약 Immutable 객체 즉, 문자열, 숫자 등을 가리키는 변수를 참조하고 값을 바꾸고자 할 때는 해당 변수가 가리키는 주소가 변경되기 때문에 nonlocal, global 키워드가 필요하다.

Suggested Pages #

0.0.1_20240214_1_v81