Namespace
- 프로그래밍 등에서 나오는 namespace는 일종의 추상적인 개념
- 변수와 함수, 클래스 등이 정의되고 사용될 수 있는 범위(scope)를 지칭함. (때문에 scope 란 용어와 자주 같이 사용됨)
- variable(변수)들의 name과 vairable이 가르키는 실제 object들의 mapping을 관리하는데 사용됨. (=Name collision을 방지하는데 사용됨).
- name (=identifier)들을 item(or element)로 가지는 일종의 set으로 생각할 수 있음.
프로그램에서 variable(변수)들은 모두 특정 namespace에 속해있으며,
어떤 namespace 에 속하느냐에 따라 같은 이름이라도 매핑된 obejct가 다르게 된다.
때문에 동일한 identifier라도 namespace가 다르게 할당하면 충돌 없이 사용이 가능하다
(즉, namespace는 같은 이름으로 발생하는 name collision을 방지한다.)
Python에서 variable은 단순히 object를 참조하고 있는 name에 불과하므로,
모든 variable들(=name들)은 특정 namespace에 속해있고,
이에 따라 해당하는 실제 object에 mapping이 됨.
프로그래밍 언어에서는 여러 namespace를 제공하는데
- global namespace, (
globals()
를 통해 가지고 있는 name 과 해당 name이 가르키는 object를 확인가능.) - function namespace,
- class namespace,
- instance namespace,
- method namespace,
- module namespace
등이 있다.
(참고로 locals()
는 해당 함수가 호출되는 순간의 local namespace가 가지고 있는 name과 대응되는 object 를 가진 dictionary를 반환.)
다음 예는 Python code로서
- global namespace에 속하는 global variable
x
와 - function namespace에 속하는 local variable
x
의
예를 보여줌.
이 둘은 각기 다른 namespace에 속하기 때문에
같은 identifier인x
를 사용하나 각기 다른 object를 가르키게 된다.
x = 10 # global variable
def foo():
x = 20 # local variable
print(x)
foo() # 출력: 20
print(x) # 출력: 10
Python의 경우,
- function call이 일어날 경우마다 해당 function의 local variable들을 포함(paramerter들도 포함됨)하는 namespace가 생성되며
- 해당 function의 execution 동안 유지되고
- 해당 function이 종료되면 해당 namespace도 사라진다.
memory model의 관점에서 보면
Python은 namespace마다 하나의 frame을 할당하여 관리한다고 생각할 수 있음.
Function call을 할 때마다
- stack에 stack frame이 생성되어 push되는 것을 기억한다면,
- 해당 stack frame이 바로 name space 에 대응한다
(좀더 엄밀하게 애기하면 function context가 stackframe에 대응).
https://dsaint31.me/mkdocs_site/CE/ch05/ch05_02_01_function/#function-call-stack
namespace는 추상적인 개념으로 frame없이도 존재할 수 있는 반면,
frame은 execution context의 일부인 data들이 저장되는데 사용되는 실제적인 것을 가르키며
stack에 의해 관리되는 frame들을 stack frame이라고 부름.
Frame
Execution Context(실행 컨텍스트)을 memory에 실제 저장하는 방식로서
function call이나 특정 code block의 실행에 필요한 data를 memory에 Stack 구조로 저장함.
- 가장 흔한 예로는 function call마다 생성되는 stack frame으로 function의 parameter, local variable과 해당 function의 수행이 끝나면 복귀할 address등을 포함하고 있음.
- 즉, stack frame은 function의 call과 return을 추적(trace)하는데 사용됨.
아래 그림에서 오른쪽에 frame들이 보여지고 있음. foo
에 대한 frame은 흐릿해짐으로서 유효한 상태가 아님을 의미함.
Context
Python에서는 "context"라는 용어는 보통 실행 컨텍스트(execution context)를 의미함 (name space와 유사하나 좀더 많은 내용을 담고 있음: context는 일종의 name space라고 볼 수 있음.).
- 실행 컨텍스트는 코드 실행 중에
변수, 함수, 클래스 등을 평가 및 실행하는 데 필요한 정보를 유지하고 관리하는
코드실행환경으로서 일종의 데이터 구조(흔히 stack)로 구현됨. - Python의 object들은 각자 특정 context에 할당되며, 이에 따라 1) scope 및 2) 유지되는 기간이 결정됨.
Context in programming is basically a structure or instance or object
that contains minimal set of attributes or properties or states
that allows to execute or manage defined set of operations or tasks.
다음과 같은 종류가 있음 (name space 와 유사함)
- Global context
- Function context
- Class context
- Instance context
- Method context
다음 Python code는 각 context 별 variable들에 대해 주석을 달아놓음.
x = 10 # 전역 컨텍스트
def foo(a):
b = 2 # 함수 컨텍스트
return a + b
class MyClass:
c = 3 # 클래스 컨텍스트
def __init__(self, d):
self.d = d # 인스턴스 컨텍스트
def method(self, e):
f = 5 # 메서드 컨텍스트
return self.d + e + f
result0 = foo(1) # 함수 호출에 따른 함수 컨텍스트 생성
print(result0) # 출력: 3
my_obj = MyClass(4) # 클래스 인스턴스 생성에 따른 인스턴스 컨텍스트 생성
result1 = my_obj.method(6) # 메서드 호출에 따른 메서드 컨텍스트 생성
print(result1) # 출력: 15
Context 종류는 다음과 같으며, 각 context는 자신의 scope 내에서 variable을 관리함.
Global Context
- script file이나 module 이 로딩될 때, 즉 프로그램이 시작될 때 생성되고, 프로그램이 종료될 때 해제됨.
- Global variable들과 funciton들을 포함함.
Function Context
- function이 호출될 때마다 생성됨 (호출되는 경우마다 각각 생성됨).
- funciton의 parameter들과 local variable들, return address들을 포함함.
- Function context를 frame (or stack frame)으로 부르기도 한다.
Class Context
- class definition의 scope내에 생성됨.
- class의 method definition들과 class variable들을 포함하며, instance context와 밀접한 관련을 가짐.
Instance Context
- class의 instance가 생성될 때 생성됨.
- 각 instance들의 attribute들이 포함됨.
Method Context
- class의 instance에서 method가 호출될 때 생성됨.
- method 내의 local variable들을 포함.
좀 더 읽어보면 좋은 자료
다음은 Python scope와 namespace에 대한 튜토리얼임.
https://docs.python.org/ko/3/tutorial/classes.html#python-scopes-and-namespaces
https://docs.python.org/3/tutorial/classes.html#python-scopes-and-namespaces
'Programming' 카테고리의 다른 글
[Python] Keyword란? (Soft Keyword 포함) (0) | 2023.06.11 |
---|---|
[Python] Comments and Docstrings (0) | 2023.06.11 |
[Python] Function Call (함수호출) (0) | 2023.06.10 |
[Python] Function Definition, Call and Arguments (0) | 2023.06.10 |
[Python] Python Interactive Shell (or Python Interactive Prompt) (0) | 2023.06.09 |