파이썬/클래스와 객체 지향

Python 생성자 함수: 가변 객체 사용

Data Jun 2025. 6. 1. 16:46

"가변 객체를 기본값으로 사용하지 말라"는 조언은 Python에서 굉장히 중요한 관례 중 하나예요.
초보자들이 실수하기 쉬운 부분이기도 하니, 아래에 이유와 해결 방법을 명확한 예제와 함께 설명드릴게요.

 

 

🚫 리스트나 딕셔너리를 기본값으로 사용하면 생기는 문제

class User:
    def __init__(self, name, tags=[]):  # 💥 위험!
        self.name = name
        self.tags = tags

이렇게 하면 겉보기엔 잘 작동하지만…

u1 = User("Alice")
u2 = User("Bob")
u1.tags.append("newbie")

print(u2.tags)  # ❗ ['newbie'] — u2도 영향을 받음

❗ 문제 원인:

  • 함수의 기본 인자는 한 번만 평가되며,
  • 가변 객체(list, dict)는 모든 인스턴스가 하나의 객체를 공유하게 됩니다.

즉, tags=[]는 한 번 만들어진 리스트를 여러 인스턴스가 같이 쓰게 됩니다.

 

 

해결법 1: None과 내부 초기화 사용

class User:
    def __init__(self, name, tags=None):
        if tags is None:
            tags = []
        self.name = name
        self.tags = tags

 

  • None을 기본값으로 쓰고, 내부에서 새로운 리스트로 초기화해줍니다.
  • 이렇게 하면 매번 새로운 리스트가 생성되어 문제 해결!

 

해결법 2: dataclass에서는 default_factory 사용

from dataclasses import dataclass, field

@dataclass
class User:
    name: str
    tags: list = field(default_factory=list)

 

 

  • default_factory=list는 새로운 리스트를 생성하는 함수를 의미합니다.
  • dict, set도 같은 방식으로 사용 가능해요.
u1 = User(name="Alice")
u2 = User(name="Bob")
u1.tags.append("newbie")
print(u2.tags)  # ✅ []

 

 

요약