https://docs.python.org/3/tutorial/classes.html#python-scopes-and-namespaces

파이썬의 네임스페이스와 스코프

핵심은
코드에서 사용하는 이름(변수,pkg명, class 명 등)과 오브젝트 간 연결
대입/삭제는 기본적으로 가장 안쪽 로컬에 바인딩/해제된다. 데이터 복사가 아닌 이름-객체 연결만 바뀌어 바인딩

생성,수명:

  • 빌트인은 인터프리터 시작 시 생성 후 종료까지 유지,.
  • 모듈 전역은 모듈이 로드될때 생성되어 보통 종료까지 유지.
  • 함수 로컬은 호출 시 생성되고 반환시 폐기 (재귀마다 별도)

스코프(검색 순서, LEGB):

  1. 가장 안쪽 로컬(현재 함수)
  2. 감싸는 함수들의 스코프 (내부외부)
  3. 현재 모둘 전역
  4. 빌트인. 텍스트 위치로 결정되며, 검색은 런타임에 이 순서를 따른다.

LEGB는 이름을 찾는 스코프 검색 순서의 약자입니다:

  • Local: 현재 함수의 로컬 스코프
  • Enclosing: 감싸고 있는 바깥 함수들의 스코프(안쪽부터 바깥쪽으로)
  • Global: 현재 모듈 전역 스코프
  • Built-in: 파이썬 내장 네임스페이스

global, nonlocal:

  • global x는 모듈 전역에 직접 바인딩
  • nonlocal x는 가장 가까운 바깥 함수 스코프에 바인딩 (없으면 같은 이름을 써도 새 로컬을 만듦)
    • 중첩된 함수에서 재 할당을 해야할때 사용
def make_counter():
  count = 0
  def inc():
	  nonlocal count   # 바깥 count를 재바인딩
	  count += 1
	  return count
  return inc
 
c = make_counter()
print(c())  # 1
print(c())  # 2
  • nonlocal은 “가장 가까운 바깥 함수 스코프”에 있는 기존 이름을 재바인딩한다.
    • 단, 모듈 전역은 대상이 아니며, 해당 이름이 어떤 바깥 함수 스코프에도 없으면 SyntaxError
def outer():
      x = 1
      def mid():
          x = 2
          def inner():
              nonlocal x  # x는 mid의 x를 가리킴 (가장 가까운 함수 스코프)
              x = 3
          inner()
          return x  # 3
      return mid()
 
  print(outer())  # 3

← python 3.14으로