네임스페이스(namespace)란 프로그래밍 언어에서 특정한 객체(Object)를 이름(Name)에 따라 구분할 수 있는 범위를 의미한다.
이 순서에 따라 검색하여 적절한 변수나 함수를 찾게 된다.
예제를 통해 변수 스코프에 대해 이해해보자
>>> def outer_func():
a = 10
def inner_func():
a = 20
print("a = %d" % a)
inner_func()
print("a = %d" % a)
>>> a = 30
>>> outer_func()
a = 20 # level0
a = 10 # level1
>>> print("a = %d" % a)
a = 30 # level2
위 예제를 통해 변수 a를 정의한 스코프가 3가지가 존재하는 것을 알 수 있다.
locals()함수를 통해 각 스코프의 네임스페이스를 확인해보자
>>> def outer_func():
a = 10
def inner_func():
a = 20
print(locals())
inner_func()
print(locals())
>>> a = 30
>>> outer_func()
{'a': 20}
{'a': 10, 'inner_func': <function outer_func.<locals>.inner_func at 0x03CEF4B0>}
>>> locals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'stock': <class '__main__.stock'>, 'outer_func': <function outer_func at 0x03CEF4F8>, 'a': 30}
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'stock': <class '__main__.stock'>, 'outer_func': <function outer_func at 0x03CEF4F8>, 'a': 30}
딕셔너리 구조로 각 네임스페이스별로 변수와 함수를 표현하고 있다.
또한, 모듈 전체에서의 지역 네임스페이스와 모듈의 전역 네임스페이스 같은 것을 확인할 수 있다.