파이썬/클래스와 객체 지향
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) # ✅ []