Python에서 데이터 구조인 딕셔너리(dict)는 종종 중첩된 정보를 저장하는 데 사용됩니다. 개발자들이 이러한 구조를 복제해야 하는 상황에 자주 부딪히는 경우는 템플릿, 구성 또는 애플리케이션의 일부 간 데이터 전송 작업을 할 때입니다.
=를 사용하여 딕셔너리를 표준으로 복사하면 원본 객체에 대한 참조만 생성합니다. 얕은 복사(shallow copy)는 딕셔너리 객체 자체를 복사하지만 중첩된 객체는 복사하지 않습니다. 깊은 복사(deep copy)는 내부의 모든 객체를 재귀적으로 복사하므로 한 복사본의 변경 사항이 다른 복사본에 영향을 주지 않도록 방지합니다.
얕은 복사를 위해 dict.copy() 또는 dict() 생성자를 사용할 수 있으며, 깊은 복사를 위해서는 copy 모듈과 deepcopy() 함수를 사용할 수 있습니다:
import copy d = {"a": 1, "b": {"c": 2}} shallow_d = d.copy() deep_d = copy.deepcopy(d) # 이제 shallow_d['b']['c']를 변경하면 d['b']['c']에 영향을 줍니다. # deep_d['b']['c']를 변경하더라도 원본 딕셔너리에 영향을 주지 않습니다.
주요 특징:
dict.copy()가 첫 번째 레벨 너머의 중첩을 복사할 수 있나요?
아니요, dict.copy()는 오직 얕은 복사만 생성합니다. 중첩된 딕셔너리는 여전히 원본 dict와 같은 객체에 대한 참조입니다.
구조에 불변 객체(예: 튜플)가 있다면 deepcopy가 이를 깊이 복사하나요?
Deepcopy는 오직 가변 중첩 객체만 복사합니다. 불변 객체는 그대로 남아 있으며, 튜플, 문자열 및 숫자는 재귀적으로 복사되지 않고 그냥 복사본으로 이동합니다.
깊은 복사를 위해 json.loads(json.dumps(dict))를 사용할 수 있나요?
가능하지만 몇 가지 조건이 있습니다. 이러한 방법은 직렬화 가능한 유형에만 작동하며, 딕셔너리에 직렬화할 수 없는 객체(예: 함수나 사용자 정의 클래스)가 포함되어 있다면 적합하지 않습니다:
import json orig = {"a": 10, "b": [1,2,3]} copy_like_deep = json.loads(json.dumps(orig)) # 복잡한 객체에는 작동하지 않습니다.
** 부정적인 사례
개발자가 copy()를 통해 설정을 복제한 다음 중첩된 값을 변경하면서 두 개의 독립적인 구조라고 생각합니다.
장점:
간단하고 빠름
단점:
하나의 복사본 내에서 중첩된 객체의 변경 사항이 모든 복사본에 영향을 미치므로 디버그가 어려운 버그 발생.
** 긍정적인 사례
개발자는 원본 dict가 평평해 보이더라도 중첩 구조에 대해 항상 copy.deepcopy()를 사용합니다.
장점:
데이터의 독립성이 보장되며 버그가 최소화됨
단점:
Deepcopy는 느리고 메모리를 더 많이 사용하며 때로는 과도할 수 있음.