이름과 연결
이름은 이름공간(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문은 반드시 이미 있는 이름을 가리켜야 한다.