함수 인자의 기본값을 mutable 성격의 오브젝트로 설정하지 않아야 하는 이유

반디·2023년 3월 31일
0

Python

목록 보기
11/11
post-thumbnail

함수 인자의 기본값으로 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'))

참고문헌

profile
꾸준히!

0개의 댓글