Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬(Python) locals(), globals(), vars() 함수의 차이점 완벽 정리

파이썬 내장 함수 locals(), globals(), vars()란?

파이썬에는 현재 스코프(범위)에 어떤 변수들이 존재하는지 확인할 수 있는 유용한 내장 함수들이 있습니다. 대표적으로 locals(), globals(), vars() 세 가지가 있으며, 각각 반환하는 네임스페이스(이름 공간)의 범위가 다릅니다.

globals()와 locals()의 기본 개념

locals()지역 스코프(local scope)에서 선언된 변수들을 딕셔너리 형태로 반환하고, globals()전역 스코프(global scope)에서 선언된 변수들을 딕셔너리 형태로 반환합니다.

흥미로운 점은 전역 스코프에서 호출하면 두 함수 모두 동일한 전역 네임스페이스 딕셔너리를 반환한다는 것입니다. 따라서 두 함수의 실질적인 차이를 확인하려면 함수 내부에서 호출해 보아야 합니다.

함수 내부에서 호출하는 예제

def fun():
    var = 123
    print("Locals:", locals())
    print("Globals:", globals())

fun()

실행 결과는 다음과 같습니다.

Locals: {'var': 123}
Globals: {'__name__': '__main__', '__doc__': None, '__package__': None,
'__loader__': <class '_frozen_importlib.BuiltinImporter'>,
'__spec__': None, 'fun': <function fun at 0x00000000037E3DD8>,
'__builtins__': <module 'builtins' (built-in)>}

출력 결과를 보면 locals()는 함수 안에서 정의된 지역 변수 var만 담고 있는 반면, globals()는 모듈 이름, 빌트인 모듈, 함수 자체 등 전역 네임스페이스의 모든 항목을 포함하는 것을 알 수 있습니다.

vars() 함수의 역할

vars()는 인자 없이 호출하면 현재 네임스페이스의 딕셔너리를 반환하고, 인자를 전달하면 해당 객체의 속성(attribute) 딕셔너리를 반환합니다.

즉, vars()locals()의 가장 큰 차이점은 vars()는 객체를 인자로 받을 수 있다는 점입니다. 예를 들어 특정 객체의 속성들을 딕셔너리 형태로 얻고 싶다면, 그 객체를 그대로 넘겨주기만 하면 됩니다.

vars()와 __dict__의 관계

객체에 대해 호출한 vars() 함수는 해당 객체의 __dict__ 속성과 사실상 동일하게 작동합니다. __dict__는 객체에 정의된 모든 속성을 담고 있는 딕셔너리입니다. 아래 예제로 직접 확인해 보겠습니다.

class A():
    def __init__(self, id):
        self.id = id

a = A(1)
print("__dict__:", a.__dict__)
print("vars(a):", vars(a))

실행 결과는 다음과 같습니다.

__dict__: {'id': 1}
vars(a): {'id': 1}

두 출력 결과가 완전히 동일한 것을 확인할 수 있습니다. 이처럼 vars(obj)obj.__dict__와 같은 결과를 반환합니다.

정리: 세 함수 비교 요약

  • locals(): 현재 지역 스코프의 심볼 테이블(딕셔너리)을 반환합니다.
  • globals(): 현재 전역(모듈) 스코프의 심볼 테이블(딕셔너리)을 반환합니다.
  • vars(): 인자가 없으면 locals()처럼 동작하고, 객체를 인자로 주면 해당 객체의 __dict__를 반환합니다.

디버깅 시 현재 사용 가능한 변수들을 빠르게 확인하거나, 객체의 속성 구조를 파악할 때 이 세 가지 함수를 적절히 활용하면 매우 편리합니다.