프로그래밍백엔드 개발자

딕셔너리 구조에서 얕은 복사(shallow copy)와 깊은 복사(deep copy)의 차이점은 무엇이며, Python에서 중첩된 딕셔너리를 올바르게 복사하는 방법은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

질문의 역사

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']를 변경하더라도 원본 딕셔너리에 영향을 주지 않습니다.

주요 특징:

  • 얕은 복사는 객체의 첫 번째 "껍질"만 복사합니다.
  • 깊은 복사는 구조 내의 모든 객체를 재귀적으로 복사합니다.
  • 중첩된 구조를 다룰 때는 항상 deepcopy를 사용해야 전체 복사본의 독립성이 보장됩니다.

예외가 있는 질문들.

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는 느리고 메모리를 더 많이 사용하며 때로는 과도할 수 있음.