🧐 🤔 그거 어떻게 쓰더라 🙄 😙

파이썬 이름, 연결, 스코프

2022. 7. 31. Evergood Kim이가 씀
같이보면 좋은 글: 파이썬 변수innerLink_28

이름과 연결

이름은 이름공간(namespace)이라는 특별한 곳에 저장된다. 이름공간은 이름→객체 매핑이다.

파이썬의 대입은 사실 변수에 값을 저장한다기 보단; 그 값을 가진 객체와 이름 사이의 연결(이름이 객체를 가리킨다)을 만드는 것이다.

변수 사용 범위

코드블럭

파이썬 프로그램은 코드 블럭들로 구성된다. 코드블럭인 것들:

  • 모듈 (최상위 코드블럭)
  • 함수 정의
  • 클래스 정의
  • if문, for문 등 복합문의 코드도 함수 정의, 클래스 정의와 마찬가지로 들여쓰기를 해서 보기엔 비슷해 보이지만; 얘넨 코드블럭은 아니다.
  • 대화형 명령 하나

이름(변수) 종류

어디서 정의됐냐에 따라

내장이름
파이썬 설치하면 원래부터 있는 내장 함수, 내장 상수 등
전역이름
모듈 수준에서 정의된 이름은 그 모듈의 전역이름(전역변수)이다.
대화형 명령에서 정의된 이름도 __main__이라는 이름의 모듈의 전역이름이다.
지역이름
그 아래 수준(함수 블럭, 클래스 블럭)에서 정의된 이름은 그 블럭에서의 지역이름(지역변수)이다.

스코프

어느 이름이 어디에서 보이느냐 마느냐(참조가능여부)를 정의한다.

  • 파이썬 내장 이름들은 어디서나 보인다.
  • 전역변수는 그 모듈 안에서 보인다.
  • (당연히) 지역변수는 그 지역변수를 정의한 그 블럭에서 보인다.

    (당연히) 지역변수는 그 지역변수를 정의한 그 블럭에서 보인다.

    def func1():
          x = 1     # 지역변수 x
          print(x)  # 지역변수 x를 읽기
  • 함수 블럭의 지역변수는 그 안쪽에서 보인다.

    함수 블럭의 지역변수는 그 안쪽에서 보인다.

    def func1():      # 함수 블럭
          x = 111       # 지역변수 x
    
          def func2():
              print(x)  # 지역변수 x를 읽기
    
          class Class1:
              hmm = x   # 지역변수 x를 읽기

    클래스 블럭의 지역변수는 그 안쪽에서 안 보인다.

    class C1:            # 클래스 블럭
          x = 1            # 클래스 어트리뷰트 x
    
          def func1():
              # print(x)   # 에러: 위의 x 참조 불가
              print(C1.x)  # 이렇게는 가능 (C1은 전역변수이므로)

이름 검색

코드에 이름이 등장하면; 지역(중첩된 경우 안쪽부터) - 전역 - 내장 이름공간 순서대로 살펴 그 이름을 찾는다.

global문, nonlocal문을 쓰면 현재 코드블럭이 아닌 그 바깥 수준의 이름이 다뤄진다. 파이썬은 변수 선언 없이 대입식만으로 변수(이름)가 새로 생겨버리니까; 이거 없으면 대입해봤자 지역변수만 새로 만들어지지; 바깥의 변수에 대입이 안 되아버림

global문

global a
global a, b, c

나열된 이름들이 전역으로 해석된다.

nonlocal문

nonlocal a
nonlocal a, b, c

나열된 이름들이; 이 바깥 스코프에서 이미 연결된 객체를 가리킨다.(전역 제외, 같은 이름 여럿일 때 가장 가까운(안쪽) 스코프)

global문으로는 새 전역변수를 만들 수 있지만 nonlocal문은 반드시 이미 있는 이름을 가리켜야 한다.

728x90