[Python] 네임스페이스

turtleJ·2023년 4월 16일
0

언어

목록 보기
4/11

네임스페이스

네임스페이스(namespace)란 프로그래밍 언어에서 특정한 객체(Object)를 이름(Name)에 따라 구분할 수 있는 범위를 의미한다.

네임스페이스의 존재 이유

  • 프로그래밍을 수행하다보면 모든 변수와 함수의 이름을 겹치지 않게 정의하는 게 어려움.
  • 따라서, 소속된 네임스페이스에 따라 같은 이름일 지라도 다른 개체를 가리키도록 하게 되었다.

네임스페이스의 종류

  • 전역 네임 스페이스(Global Namespace): : 모듈별로 존재하며, 모듈 전체에 통용되는 이름을 사용한다.
  • 지역 네임 스페이스(Local Namespace) : 함수 및 메소드 별로 존재하며, 함수 내의 지역 변수들이 소속된다.
  • 빌트인 네임 스페이스(Built-in Namespace) : 기본 내장 함수 및 기본 예외들의 이름을 저장하는 곳. 파이썬으로 작선된 모든 코드 범위를 포함함.

네임스페이스 검색 순서(LEGB 규칙에 따라 검색)

  1. 지역 네임 스페이스
  2. 전역 네임 스페이스
  3. 빌트인 네임 스페이스

이 순서에 따라 검색하여 적절한 변수나 함수를 찾게 된다.

네임스페이스의 특징

  • 딕셔너리 형태로 구현되어 있다.
  • 즉 이름과 실제 객체들 사이의 매핑이다.

파이썬의 변수 스코프

  • 변수 스코프란 변수의 이름으로 그 변수가 가리키는 엔티티를 찾을 수 있는 영역의 범위를 말한다.
  • C나 자바 같은 언어는 블럭 단위의 스코프를 사용한다.
  • 파이썬에서는 블럭 단위의 스코프는 존재하지 않으며 오직 지역 변수와 전역변수만 존재한다.
  • globals() 함수를 통해 전역 네임 스페이스의 사본을 얻을 수 있다.
  • locals()함수를 통해 현재 스코프의 네임스페이스의 사본을 얻을 수 있다.

예제를 통해 변수 스코프에 대해 이해해보자

>>> 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가지가 존재하는 것을 알 수 있다.

  • level 0 : inner_func() 내부
  • level1 : outer_func() 내부
  • level2 : 모듈 전체의 네임스페이스

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}

딕셔너리 구조로 각 네임스페이스별로 변수와 함수를 표현하고 있다.

또한, 모듈 전체에서의 지역 네임스페이스와 모듈의 전역 네임스페이스 같은 것을 확인할 수 있다.

profile
꾸준함을 무기로 성장하는 개발자가 되겠습니다.

0개의 댓글