기본 패턴
python
def append_item(item, items=None):
if items is None:
items = []
items.append(item)
return items설명
- Python 함수의 기본값은 함수가 호출될 때마다 새로 만들어지는 것이 아니라, 함수 정의 시점에 한 번 평가됩니다.
- 따라서 리스트나 딕셔너리 같은 가변 객체를 기본값으로 두면 여러 호출이 같은 객체를 공유할 수 있습니다.
- 이 문제를 피하는 가장 흔한 패턴이
None을 기본값으로 두고 함수 내부에서 새 객체를 만드는 방식입니다. - 함수 인터페이스를 유연하게 유지하면서도 예측 가능한 동작을 만들기 좋은 패턴입니다.
짧은 예제
python
def collect_name(name, names=None):
if names is None:
names = []
names.append(name)
return names빠른 정리
| 방식 | 결과 |
|---|---|
items=[] 기본값 | 호출 간 상태가 공유될 수 있음 |
items=None 후 내부 초기화 | 호출마다 새 객체 생성 가능 |
| 가변 기본값 | 주의 필요 |
| 불변 기본값 | 상대적으로 안전 |
공식 참고: More on Defining Functions
주의할 점
가변 기본값 문제는 문법 오류가 아니라 논리 오류라서 더 위험합니다. 처음에는 잘 동작하는 것처럼 보여도 여러 번 호출되면 의도하지 않은 값이 누적될 수 있습니다.