본문 바로가기

알쓸코잡

dict.fromkeys()에 관한 사실

dict.fromkeys()에 관한 사실

 

나는 파이썬 내장 함수인 dict.fromkeys()를 자주 사용하는 편인데,

처음 회사를 다닐 때 본 뒤로 자주 사용하는 것 같다.


사용하는 이유

간결성, 내장함수, 그리고 핵심이유는

"불변 객체를 사용한 초기화"가 유용해서 자주 사용한다.

 

하지만 오늘 아래와 같은 만행을 저질렀다.

간략한 예시를 들어보겠다.

key = ['key1', 'key2', 'key3']
dict1 = dict.fromkeys(key, [])

dict1['key1'].append('value1')

print(dict1)

 

 

여기서 내가 예상한 기댓값은 아래였지만,

{'key1': ['value1'], 'key2': [], 'key3': []}

 

실제 결과는 다음과 같았다.

{'key1': ['value1'], 'key2': ['value1'], 'key3': ['value1']}

문제점은

"dict.fromkeys()를 호출할 때 리스트와 같은 가변 객체를 사용하면 모든 키가 동일한 객체를 참조하게 된다는 사실"

을 모르고 사용하고 있었던 것이다.

 

즉, dict.fromkeys()가 value(list, [])값을 복사하지 않고 동일한 객체(key1, key2, key3)에게 할당했다.

key = ['key1', 'key2', 'key3']
dict1 = dict.fromkeys(key, [])

 

놀랍게도 이제 알았다

해결 방법은 독립적인 빈 리스트를 생성해 주면 된다.

dict2 = {key: [] for key in ['key1', 'key2', 'key3']}

dict2['key1'].append('value1')
print(dict2)

#  {'key1': ['value1'], 'key2': [], 'key3': []}