함수 인자의 기본값으로 mutable 성격의 오브젝트 (ex. 리스트, 딕셔너리, 클래스 인스턴스)를 사용해서는 안된다.
A) None을 사용!
예제로 이유를 살펴보자
Example
def add_item(new_item, inputs=[]):
print("current inputs", inputs)
inputs.append(new_item)
return inputs
print(add_item('apple'))
print(add_item('banana'))
실행결과
리스트는 메모리 주소 정보로, 함수 인자의 기본값으로 inputs = [] 를 선언하는 순간 inputs를 메모리의 특정 주소를 가리키게 된다.
처음 add_item을 호출할 때는 inputs이 가리키는 메모리 주소에 아무것도 저장되어있지 않았으므로, 빈 리스트에 'apple'을 넣는 것이라 결과값이 ['apple']로 나왔다.
그러나 두번째로 add_item을 호출할 때에는, inputs이 가리키는 메모리 주소에 'apple'이 들어가있는 상태이다.
따라서 ['apple']에 'banana'가 추가된 형태로 값이 리턴되는 것이다.
solution mutable 성격의 오브젝트를 함수 인자로 받을 경우에는 다음과 같이 작성해보자.
Example (Fixed)
def add_item(new_item, inputs=None):
if inputs == None:
inputs = list()
print("current inputs", inputs)
inputs.append(new_item)
return inputs
print(add_item('apple'))
print(add_item('banana'))
참고문헌