가변 기본 인자(Mutable Default Argument)는 함수 정의에서 매개변수의 기본값으로 변경 가능한(mutable) 객체를 사용하는 것을 의미합니다. 이 경우, 함수가 호출될 때마다 매개변수의 기본값이 같은 객체를 참조하게 됩니다. 이러한 동작은 예기치 않은 결과를 초래할 수 있으므로 주의가 필요합니다.
다음은 가변 기본 인자를 사용하는 예제 코드입니다.
```python
def add_item(item, items=[]):
items.append(item)
return items
print(add_item('apple')) # ['apple']
print(add_item('banana')) # ['apple', 'banana']
```
위의 예제에서는 `add_item()` 함수가 호출될 때마다 `items` 리스트에 `item`을 추가합니다. 그러나 해당 함수를 처음 호출하면 `items` 리스트는 빈 리스트로 초기화됩니다.
첫 번째 호출 시, `['apple']`이 반환됩니다. 그러나 두 번째 호출 시, `['apple', 'banana']`이 반환됩니다. 이는 `items` 리스트가 기본값으로 설정된 함수 정의 시점에 한 번만 생성되고, 이후에는 계속해서 같은 객체를 참조하기 때문입니다.
해결책으로는 기본값으로 변경 불가능한(immutable) 객체를 사용하거나, 기본값을 `None`으로 설정하고 함수 내부에서 새로운 객체를 생성하는 방법을 사용할 수 있습니다.
여기에 수정된 예제 코드가 있습니다.
```python
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
print(add_item('apple')) # ['apple']
print(add_item('banana')) # ['banana']
```
이제 `add_item()` 함수가 호출될 때마다 항상 새로운 빈 리스트가 생성되어 사용되므로, 예기치 않은 결과를 방지할 수 있습니다.
더 자세한 정보는 파이썬 공식 문서에서 확인하실 수 있습니다. (https://docs.python.org/3/tutorial/controlflow.html#default-argument-values)
주의: 주의사항을 지키지 않을 경우, 예기치 않은 결과뿐만 아니라 디버깅이 어려워질 수도 있습니다. 함수를 작성할 때 가변 기본 인자를 사용하면 인자의 값을 외부에서 수정하는 부작용이 있을 수 있으므로, 신중하게 사용해야 합니다.
댓글