반응형
질문
파이썬의 스코핑 규칙은 정확히 무엇인가요?
다음과 같은 코드가 있다면:
code1
class Foo:
code2
def spam.....
code3
for code4..:
code5
x()
x
는 어디에서 찾을 수 있을까요? 가능한 선택지는 아래 목록에 포함됩니다:
- 감싸고 있는 소스 파일에서
- 클래스 네임스페이스에서
- 함수 정의에서
- for 루프의 인덱스 변수에서
- for 루프 안에서
또한 함수 spam
이 다른 곳으로 전달될 때 실행 중인 문맥도 있습니다. 그리고 아마도 람다 함수는 조금 다르게 전달될 수도 있습니다.
중급 파이썬 프로그래머에게 혼동스러운 세상에는 반드시 간단한 참고 자료나 알고리즘이 있을 것입니다.
답변
실제로, 파이썬 범위 결정에 대한 간결한 규칙은 Learning Python, 3rd. Ed.에서 가져왔습니다. (이러한 규칙은 속성이 아닌 변수 이름에만 적용됩니다. 점 없이 참조하는 경우 이러한 규칙이 적용됩니다.)
LEGB 규칙
Local — 함수 (
def
또는lambda
) 내에서 어떤 방식으로든 할당된 이름이며 해당 함수에서 전역으로 선언되지 않은 경우Enclosing-function — 내부에서 외부로의 정적인 모든 함수의 지역 범위에서 할당된 이름
Global (module) — 모듈 파일의 최상위에서 할당된 이름 또는 파일 내의
def
에서global
문을 실행하여 할당된 이름Built-in (Python) — 내장 이름 모듈에서 미리 할당된 이름:
open
,range
,SyntaxError
등
따라서, 다음과 같은 경우
code1
class Foo:
code2
def spam():
code3
for code4:
code5
x()
for
루프는 자체적인 네임스페이스를 가지고 있지 않습니다. LEGB 순서대로 범위는 다음과 같습니다.
- L:
def spam
의 로컬 범위 (code3
,code4
,code5
에서) - E: 다른
def
에 있는 경우 모든 내포된 함수의 로컬 범위 - G: 모듈에서 전역으로 선언된
x
가 있는 경우 (code1
에서) - B: 파이썬 내장
x
x
는 code2
에서는 절대로 찾을 수 없습니다. (예상했을 때에도, Antti의 답변이나 여기를 참조하세요.)
반응형
댓글