dict.fromkeys에 빈 리스트를 넣으면 값들이 함께 바뀌는 이유

이 카테고리 글 목록

전체글 보기

딕셔너리에서 키마다 따로 쓸 빈 리스트가 필요하면 {key: [] for key in keys}로 만드세요. 키를 하나 처리할 때마다 []를 새로 만들어, 한 칸에 작업을 추가해도 다른 칸은 비어 있습니다.

keys = ["todo", "done"]
buckets = {key: [] for key in keys}
buckets["todo"].append("검토")
print(buckets)
{'todo': ['검토'], 'done': []}

같은 리스트를 바꾸는 것과 새 리스트를 넣는 것

dict.fromkeys(keys, [])는 모든 키가 같은 리스트 하나를 값으로 가리키게 합니다. append()로 그 리스트에 작업을 넣으면 두 키에서 모두 보입니다. 한 키에 새 리스트를 대입하면 그 키만 새 리스트를 가리킵니다.

keys = ["todo", "done"]
buckets = dict.fromkeys(keys, [])
buckets["todo"].append("검토")
print(buckets)

buckets["todo"] = ["발행"]
print(buckets)
{'todo': ['검토'], 'done': ['검토']}
{'todo': ['발행'], 'done': ['검토']}

첫 출력에서 두 키는 같은 리스트를 보고 있습니다. 대입 뒤의 done은 여전히 처음 리스트를 가리켜 "검토"를 담고 있습니다. 모든 키의 시작값이 정수 0처럼 바꿀 수 없는 값이라면 dict.fromkeys(keys, 0)로 초기화할 수 있습니다. 키마다 제각각 추가하거나 삭제할 목록이라면 첫 예제처럼 처음부터 각각 만드는 편이 분명합니다.

가상 작업 목록은 Windows의 Python 3.14.3에서 실행했습니다. 초기값 공유는 Python의 dict.fromkeys 문서에 설명돼 있습니다. 이미 존재하는 중첩 객체를 다룬다면 얕은 복사에서 안쪽 객체가 공유되는 예도 참고할 수 있습니다.

이 카테고리의 다른 글

전체글 보기

“dict.fromkeys에 빈 리스트를 넣으면 값들이 함께 바뀌는 이유”에 대한 1개의 생각

댓글 남기기