안녕하세요. 조가희입니다. 이번 시간에는 제가 가희 코테를 열면서 풀이를 검증했을 때 사용해서 편리했던 defaultdict에 대해 알아보도록 하겠습니다.

 


 먼저, 아래 프로그램을 봅시다.

 

 

 처음에 1번 키가 있고, value 값이 빈 리스트입니다. 그리고 1번 key의 value 값에 append(2)를 합니다. 그러면 1번 키는 2만 들어가 있는 리스트에 대응될 겁니다.

 

 1번째 줄에서 dic은 위와 같이 되어 있습니다.

 

 

 2번째 줄이 수행되고 나서, key 1에 대응되는 것은 2가 들어 있는 list일 테니, {1: [2]}가 출력될 겁니다. 문제는 그 다음에 키 2에 있는 값에 접근한다는 것입니다.

 

 

 그런데, 이것은 dic에 없는 키입니다. 따라서, KeyError가 뜹니다.

 

 

 실행 결과는 위와 같습니다.

 


 defaultdict는 뭘까요? 문서를 보면, 생성자로 들어가는 1번째 인자인 default_factory가 키가 없을 때 어떻게 처리할 것인지와 관련이 있음을 알 수 있어요. 그리고 __missing__을 보시면, 아래와 같은 주석이 있습니다.

 

 

 missing_key의 경우는 키가 없다는 의미입니다. 이 때에 default_factory가 None이면 KeyError를 떨굽니다. 키가 없기 때문입니다. 그렇지 않다면, 예를 들어 collections.defaultdict(list)이면, key값에 대응되는 것이 list()가 됩니다.

 

 missing_key 메서드의 알고리즘입니다. default_dict에 아무런 인자도 넣지 않고 생성했다면, dict와 같이 KeyError를 떨굽니다. 그렇지 않으면, 생성자에 넘겨줬던 list와 같은 것을 떨구게 됩니다.

 

 

 이제, 이 프로그램을 보도록 하겠습니다. 처음에, defaultdict가 선언이 되었는데요. 생성자에 list를 넣었어요.

 

 그런데, dic[1].append(2)를 바로 호출했어요. 처음에 키 1은 없었으니, 빈 리스트가 리턴됩니다.

 

 

 다음에 append 2를 호출하였으므로, 키 1은 2가 하나 추가된 리스트와 대응됩니다. 마찬가지로 키 2에 대해서도 생각해 보면, 키 2값이 없었으므로, default 값인 빈 리스트가 리턴됩니다. 다음에 3이 추가되므로, 키 2는 3이 하나 추가된 리스트와 대응됩니다.

 

 

 실행 결과는 위와 같습니다. 정리하면 defaultdict는 키 값이 없을 때 디폴트 값으로 어떤 값을 떨궈줄 것인지 설정할 수 있습니다. 그래서, dic[1].append(3) 이런 게 호출되었을 때, 1이 없다면, default 값으로 대응시킬 수 있게 됩니다.