컴퓨터 프로그래밍

파이썬 동적 변수 할당 방법 3가지 - globals(), 딕셔너리, setattr()

pajaro9966 2025. 5. 19. 01:39
728x90
728x90

 코드를 짜다보면 변수 생성을 자동화하고 싶을 때가 있다. 너무 많은 변수를 만들어야 할 때, 변수를 몇 개 만들어야 하는지 알 수 없을 때 그렇다. 그런데 방법을 아예 모르는 상태에서는 막상 코드를 짜려고 하면 막막하다. 원래는 for문을 이용한 방법을 알고 있었는데 최근에 딕셔너리와 setattr() 를 이용한 방법도 알게 되었다. 좋은 건 나누면 복이 오니까 포스팅을 하겠슴둥 (사실 setattr 를 이용한 방법은 이 글을 쓰면서 알았다. 이런 게 있었다니... 끝이 없는 배움의 길이다.)

 

1. globals() 를 이용한 방법

 가장 직접적인 방법이다. 내장함수 globals()를 이용한 방법. 아래 예시 코드를 실행시키면, 정상적으로 x0, x1, x2 값이 출력되는 걸 확인할 수 있다. 맨 아래 참고자료에 파이썬 빌트인 함수 링크를 첨부할 테니, globals() 함수가 더 궁금한 사람들은 들어가서 찾아보자.

 뭔가 eval() 같은 느낌이 난다. globals()를 이용하면 for문으로 변수를 생성할 수 있고, eval()을 이용하면 for문으로 변수를 호출할 수 있는 느낌이랄까.

 

# globals() 이용한 방법
for i in range(3):
    globals()[f'x{i}'] = i * 2


# 값 확인하기
print(x0)
print(x1)
print(x2)

 

x0, x1, x2값이 붉은 밑줄이 그어져 있지만, 정상적으로 출력된다.

 

2. 딕셔너리를 이용한 방법

 이 방법은 약간 우회하는? 넌센스 퀴즈를 푸는 것 같은 느낌의 방법이다. 문자열 포매팅(string formatting)과 딕셔너리를 통해 딕셔너리의 key:value 쌍을 반복문으로 만들어 주는 것! 이렇게 하면 딕셔너리에 키를 입력해 value를 호출하는 방법으로 변수를 사용할 수 있다. 참으로 기발하지 않은가?

 

# 딕셔너리를 이용한 방법
test_dict = dict()

for i in range(3):
    test_dict[f'x{i}'] = i

print(test_dict['x0'])
print(test_dict['x1'])
print(test_dict['x2'])

 

 

3. setattr() 를 이용한 방법

 나는 setattr() 의 존재를 이 글을 쓰면서 난생처음 알게 되었다. 클래스에 속한 변수를 수정하는 기능이라고 한다. 수정이라고는 하지만 없던 변수를 생성할 수도 있고, 이를 이용해 동적 변수 할당이 가능하다. 마찬가지로 아래 참고 자료의 파이썬 빌트인 함수 링크를 따라가면 함수에 대한 설명을 볼 수 있다.

 

class MyClass:
    pass

my_object = MyClass()

for i in range(3):
    setattr(my_object, f'attr_{i}', i * 4)

print(my_object.attr_0)  # 0
print(my_object.attr_1)  # 4
print(my_object.attr_2)  # 8

 

 

이번에도 잘 출력되는 걸 확인할 수 있다. 근데 헷갈릴 수도 있는 게, 정의된 클래스 변수와 인스턴스 변수를 아예 수정하는 게 아니다. 무슨 말인고 하니, 원래 있던 setattr() 로 값을 수정한다고 해도, 원래의 클래스 변수와 인스턴스 변수는 변하지 않는다. 그래서 새로 만들어진 클래스 객체들은 원래의 변수값을 갖는다. 말로는 설명이 어려우니 이미지로 보자.

 

setattr() 해줬지만, 이후 새로 만든 my_object2의 attr3, attr4는 각각 5, 10 그대로다.

 

참고 자료

1. 파이썬 빌트인 함수 소개 : https://docs.python.org/3/library/functions.html

728x90