https://docs.python.org/3/tutorial/classes.html#python-scopes-and-namespaces
파이썬의 네임스페이스와 스코프
핵심은
코드에서 사용하는 이름(변수,pkg명, class 명 등)과 오브젝트 간 연결
대입/삭제는 기본적으로 가장 안쪽 로컬에 바인딩/해제된다. 데이터 복사가 아닌 이름-객체 연결만 바뀌어 바인딩
생성,수명:
- 빌트인은 인터프리터 시작 시 생성 후 종료까지 유지,.
- 모듈 전역은 모듈이 로드될때 생성되어 보통 종료까지 유지.
- 함수 로컬은 호출 시 생성되고 반환시 폐기 (재귀마다 별도)
스코프(검색 순서, LEGB):
- 가장 안쪽 로컬(현재 함수)
- 감싸는 함수들의 스코프 (내부→외부)
- 현재 모둘 전역
- 빌트인. 텍스트 위치로 결정되며, 검색은 런타임에 이 순서를 따른다.
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