Python Namespace
Namespace란?
- 특정한 Object를 이름에 따라 구분할 수 있는 범위
- Python은 모든 것들을 Object로 관리한다고 말씀드렸는데,
- 특정 이름과 Object를 Mapping 관계를
Dictionary
형태로 가지고 있다. - 각 Namespace는 딕셔너리 형태로 구현되며, Namespace의 Value는 Object를 가르킨다.
- Built-in은 Namespace에 함부로 추가,삭제 불가
- 결론 : 네임스페이스가 다르다면, 값을 참조할 수 없다.
우선 순위 built-in > global > local
-
Global Namespace
모듈 별로 존재
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
test = "kai_test" print(globals()) > { '__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x100940eb0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/wclub/git/airflow/wclub-airflow/dags/test6.py', '__cached__': None, 'test': 'kai_test' }
-
Local Namespace
Function, Method 별로 존재, Funcion 내의 Local variable이 소속
1 2 3 4 5 6 7 8 9
test = "kai_test" def namespace_test(): test = "function test" print(locals()) namespace_test() > {'test': 'function test'}
-
Built-in Namespace
기본 내장 함수 및 예외들의 이름 저장
1
print(dir(__builtins__))
Global()
–
- Global 변수에 접근 가능하게 만들어준다.
1
2
3
4
5
6
7
8
9
def namespace_test():
global test
test = "local_space"
return
test = "kai_test"
print(test)
namespace_test()
print(test)
Local()
- 상위 Level의 Local 변수를 접근 가능하게 만들어준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def namespace_test():
test = 0
def nonlocal_test():
test = 100
print(test)
nonlocal_test()
print(test)
def namespace_test2():
test = 0
def nonlocal_test():
nonlocal test
test = 100
print(test)
nonlocal_test()
print(test)
namespace_test()
print("-"*10)
namespace_test2()
참조
https://leffept.tistory.com/431#:~:text=네임스페이스란 특정한 객체,을 네임스페이스라고 합니다.