본문 바로가기
Python/Python FAQ

Python 스코프 규칙에 대한 간단한 설명, Short description of the scoping rules

by 베타코드 2023. 10. 13.
반응형

질문


파이썬의 스코핑 규칙은 정확히 무엇인가요?

다음과 같은 코드가 있다면:

code1
class Foo:
   code2
   def spam.....
      code3
      for code4..:
       code5
       x()

x는 어디에서 찾을 수 있을까요? 가능한 선택지는 아래 목록에 포함됩니다:

  1. 감싸고 있는 소스 파일에서
  2. 클래스 네임스페이스에서
  3. 함수 정의에서
  4. for 루프의 인덱스 변수에서
  5. 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

xcode2에서는 절대로 찾을 수 없습니다. (예상했을 때에도, Antti의 답변이나 여기를 참조하세요.)

반응형

댓글