namespace와 binding에 대해 설명이 가장 잘 돼있는 곳.
https://www.slideshare.net/slideshow/binding-20160229-58415344/58415344
파이썬은 동적 바인딩(Dynamic Binding)을 사용하고, 따라서 실행 시간(run time)중에 binding이 일어나고, 프로그램 실행 도중 변경이 가능하다.(메모리 유동적)
즉, python에서는 num = 10으로 할당하는 순간 변수의 자료형을 결정한다.
(num : 동적 바인딩되는 변수를 동적 변수라고 하는 것.)
파이썬은 객체와 연결된 이름을 관리하는 공간이 있다.
이를 namespace라하고, locals()와 globals() 영역이다.
각 모듈은 각자의 globals namespace를 가지고있고, import시 다른 모듈의 변수를 참조하게 된다.
이 때, all = ('변수명') 을 모듈에서 정의해놓으면 다른 모듈에서 import를 할 때 해당 변수만 참조할 수 있다.
여기서 class는 dict 에서 namespace를 관리하는데, instance의 namespace와 class의 namespace는 차이가 있다.
(built in module 에서 정의된 class들은 dict 가 없다.)
instance의 변수를 참조할 땐, instance -> class -> parent class
순으로 namespace를 조회해서 참조하는 듯 하다.
스코프는 그 변수가 유효한 범위를 의미하며, 해당 범위를 벗어나면 사용할 수 없다.
다음과 같은 4가지 종류가 있다.
Local Scope : 함수 내에서 정의된 변수의 범위
Enclosing Scope : 중첩 함수에서 외부 함수 영역에서 정의된 변수의 범위
Global Scope : 모듈 가장 바깥 영역에서 정의된 변수의 범위
Built in Scope : Built in Module에 정의된 변수의 범위
파이썬은 캡슐화를 하는 객체지향 언어로서, 영역 밖에서는 접근할 수가 없다.
반대로 상위의 스코프는 하위의 스코프를 포함하고 있는 관계이기 때문에 당연하게도 하위 공간에서 상위 공간의 변수를 참조할 수 있어야 한다.
이 개념을 구현하기 위한 원리가 Scope Rule(LEGB Rule)로 어떤 변수를 참조 또는 바인딩할 때, LEGB 순으로 스코프를 참조하는 순서를 정해놨다.
즉, 각 공간에서 같은 이름의 변수를 정의할 수 있고, 변수를 참조할 때 순서에 따라 참조하는 방식으로 구현해놨다.
실제 사용 예를 보면,
x = 10 을 정의하고,
함수 내에 x = 20을 정의하면 함수 내에서 사용하는 x는 Local Scope(이는 개념에 관한 용어이고, 해당 함수의 locals() dict에 저장된 변수 이름을 불러오는 원리일 듯 하다. 즉, globals()와 locals() namespace에 의해 구분지어지는 영역이라고 보면 될 듯 하다.)의 x(20)가 참조되는 것이다.
정의하지 않으면 globals() 영역의 x(10)를 참조할 것이다.
하지만, 상위 영역의 변수를 참조할 수는 있지만, 할당 또는 바인딩 할 수는 없다. 바인딩하게 되면, Local Scope 에서만 사용할 수 있는 변수가 되는 것.
그렇기 때문에 global x (또는 nonlocal x) 명령어를 통해 상위 영역의 변수를 바인딩할 수 있게 된다.
하지만, 중요한 점은 같은 이름의 2개의 변수가 참조되는 경우가 생기면 error가 발생하는데, 다음과 같은 경우이다.
1. global x 명령어 없이 x = x + 10 을 사용하면, 파이썬 인터프리터는 x를 local 변수라고 생각한다.(symbol table 분석)
즉, 미리 x 변수를 locals() 에 저장할 변수라는 것을 미리 아는 듯 하다.
(global x 명령어 없는 할당은 locals() 영역에 저장해야하는데, 이 때 충돌이 일어나는 것 같다.)
2. 이번에는 x를 먼저 정의하고, global x 명령어를 사용하는 경우인데, 이 때도 에러가 발생한다.
제네릭프로그래밍 : 파이썬은 인자를 받을 때 동적으로 타입이 결정된다.
매개변수, 가변인수, 키워드인수
decorator / metaclass / discriptor
closure
패키지, 버전관리, 모듈
독스트링 : 설명
실행환경
GIL
dataclasses
5가지 @ by youtube