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, [])
놀랍게도 이제 알았다
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/021.gif)
해결 방법은 독립적인 빈 리스트를 생성해 주면 된다.
dict2 = {key: [] for key in ['key1', 'key2', 'key3']}
dict2['key1'].append('value1')
print(dict2)
# {'key1': ['value1'], 'key2': [], 'key3': []}
'알쓸코잡' 카테고리의 다른 글
JWT(JSON Web Token) 으로 3행시 해보겠습니다 (2) | 2023.08.31 |
---|---|
Race Condition과 Thread.Lock (Feat. 파이썬) (0) | 2023.06.09 |
꼬리에 꼬리를 무는 Proxy 이야기 (0) | 2023.05.08 |
[강좌] 개발자를 위한 ChatGPT 프롬프트 엔지니어링 - Andrew Ng (2) | 2023.04.29 |
꼬리에 꼬리를 무는 웹 스크래핑/크롤링 이야기 (0) | 2023.04.27 |