선택 매개변수의 안전한 기본값을 설계합니다.
기본값은 함수가 정의될 때 한 번 평가됩니다. 숫자, 문자열, None 같은 변경 불가능 값은 안전하지만 리스트와 딕셔너리를 기본값으로 두면 여러 호출이 같은 객체를 공유합니다.
courses 없이 부른 두 호출이 ['Python']과 ['SQL']을 따로 출력하는 것은 if courses is None 검사가 호출마다 빈 리스트를 새로 만들기 때문입니다. 기본값을 []로 두면 그 리스트는 def 문이 실행될 때 하나만 만들어져, 두 번째 출력이 ['Python', 'SQL']로 바뀝니다.
None을 기본값으로 받고 함수 안에서 새 리스트를 만들면 호출마다 독립적인 객체를 얻습니다. None 자체가 유효한 입력이라면 별도 sentinel 객체를 사용합니다.
기본값은 대부분의 호출에 자연스러운 동작이어야 하며 숨겨진 시간, 환경, 전역 상태에 의존하지 않게 합니다.
def add(item, items=[])는 이전 호출의 항목이 다음 호출에 남는 대표적인 버그입니다.
직접 바꿔보세요options 딕셔너리를 선택적으로 받아 복사한 뒤 수정하는 함수를 만들어보세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.