[Python] 깊은 복사와 얕은 복사: 리스트, 딕셔너리 등 이해하기

파이썬에서는 객체의 복사본을 만드는 깊은 복사와 얕은 복사 두 가지 방법이 있다. 깊은 복사는 객체와 그 내부의 모든 객체를 완전히 새롭고 독립적인 복사본으로 생성하는 반면, 얕은 복사는 원본 객체의 내용을 참조하는 새로운 객체를 생성한다. 이러한 차이점은 한 객체에 대한 변경이 다른 객체에 어떻게 영향을 미치는지에 영향을 준다.

이 포스트에서는 파이썬에서 깊은 복사와 얕은 복사를 자세히 살펴보고, 리스트, 사전, 문자열, 정수와 같은 객체를 사용하여 이러한 두 유형의 복사를 비교한다.

깊은 복사

copy 모듈을 이용한 방법

파이썬은 객체의 깊은 복사본을 생성하는 deepcopy 메서드를 포함하는 copy 모듈을 제공한다.

python
import copy

original_list = [1, [2, 3], [4, 5]]
deep_copied_list = copy.deepcopy(original_list)
deep_copied_list[1][0] = '변경됨'
print(original_list)  # Output: [1, [2, 3], [4, 5]]

위 코드 조각은 deepcopy 메서드를 사용하여 깊은 복사본을 생성하는 방법을 보여준다. deep_copied_list에 대한 변경은 original_list에 영향을 미치지 않는다.

얕은 복사

copy 메서드를 이용한 방법

copy 모듈의 copy 메서드 또는 객체의 내장 복사 기능을 사용하여 얕은 복사본을 만들 수 있다.

python
import copy

original_dict = {'a': [1, 2], 'b': [3, 4]}
shallow_copied_dict = copy.copy(original_dict)
shallow_copied_dict['a'][0] = '변경됨'
print(original_dict)  # Output: {'a': ['변경됨', 2], 'b': [3, 4]}

이 코드 조각은 얕은 복사본에 대한 변경이 원본 객체의 내용을 참조하므로 original_dict에 반영된다는 것을 강조한다.

다양한 객체 타입 복사

파이썬에서는 리스트, 사전, 문자열, 정수와 같은 다양한 유형의 객체에서 깊은 복사와 얕은 복사를 수행할 수 있다. 이러한 복사 방법의 동작은 Mutable 타입과 Immutable 타입 사이에 차이가 있다.

List

깊은 복사

python
import copy

original_list = [1, [2, 3], [4, 5]]
deep_copied_list = copy.deepcopy(original_list)

얕은 복사

python
original_list = [1, [2, 3], [4, 5]]
shallow_copied_list = original_list.copy()
shallow_copied_list[1][0] = '변경됨'
print(original_list)  # Output: [1, ['변경됨', 3], [4, 5]]

리스트의 경우 깊은 복사는 완전히 독립된 복사본을 생성하는 반면, 얕은 복사는 중첩된 객체에 대한 공유 참조를 생성한다.

Dict

깊은 복사

python
import copy

original_dict = {'a': [1, 2], 'b': [3, 4]}
deep_copied_dict = copy.deepcopy(original_dict)

얕은 복사

python
original_dict = {'a': [1, 2], 'b': [3, 4]}
shallow_copied_dict = original_dict.copy()
shallow_copied_dict['a'][0] = '변경됨'
print(original_dict)  # Output: {'a': ['변경', 2], 'b': [3, 4]}

사전의 경우, 깊은 복사는 완전히 새로운 객체를 생성하는 반면, 얕은 복사는 중첩된 객체에 대한 참조를 결과로 한다.

Str, Int (Immutable 타입)

깊은 복사

python
original_str = "text"
deep_copied_str = copy.deepcopy(original_str)
original_int = 42
deep_copied_int = copy.deepcopy(original_int)

얕은 복사

python
original_str = "text"
shallow_copied_str = copy.copy(original_str)
original_int = 42
shallow_copied_int = copy.copy(original_int)

문자열과 정수는 변경할 수 없으므로 얕은 복사와 깊은 복사는 동일한 방식으로 동작하여 완전히 새로운 객체를 생성한다.

요약 표

객체 유형깊은 복사얕은 복사Mutable / Immutable
리스트독립적인 복사본 생성중첩된 객체에 대한 공유 참조Mutable
사전독립적인 복사본 생성중첩된 객체에 대한 공유 참조Mutable
문자열독립적인 복사본 생성독립적인 복사본 생성Immutable
정수독립적인 복사본 생성독립적인 복사본 생성Immutable

파이썬에서 복잡한 데이터 구조를 효과적으로 다루기 위해서는 객체가 어떻게 복사되고 참조되는지를 이해하는 것이 중요하다. 이는 객체가 복제되고 참조되는 방식에 대한 정확한 제어를 제공하며, 보다 정확하고 효율적인 코드를 구성하는 데 도움이 된다.


파이썬에서 복잡한 데이터 구조를 조작하는 데 있어 깊은 복사와 얕은 복사의 차이를 이해하는 것은 중요하다. 객체가 복제되고 참조되는 방식에 대한 정확한 제어를 가능하게 하여 더 간결하고 효율적인 코딩 방식을 가능하게 한다.


자주 묻는 질문

  1. 깊은 복사와 얕은 복사의 주요 차이점은 무엇인가? 깊은 복사는 완전히 새로운 객체를 생성하는 반면, 얕은 복사는 원본 객체의 내용을 참조하는 새로운 객체를 생성한다.
  2. 사전이나 리스트의 깊은 복사본을 어떻게 생성할 수 있나요? 깊은 복사본을 생성하려면 copy 모듈의 deepcopy 메서드를 사용한다.
  3. 모든 유형의 객체에 얕은 복사가 적합한가요? 얕은 복사는 Mutable 객체와 Immutable 객체에서 다르게 동작한다. 이러한 동작을 이해하는 것은 복사 방법을 선택할 때 중요하다.
  4. 얕은 복사본에 대한 변경이 원본 객체에 영향을 미칠 수 있나요? 그렇다, 리스트와 사전과 같은 변경 가능한 객체의 얕은 복사본에 대한 변경은 원본 객체에 영향을 미칠 수 있다.
  5. 얕은 복사와 깊은 복사 중 어느 것이 더 효율적인가? 얕은 복사는 일반적으로 전체 객체를 다시 생성하지 않으므로 더 효율적이다. 그러나 얕은 복사와 깊은 복사 사이의 선택은 코드의 특정 요구 사항에 따라 달라야 한다.
© Copyright 2023 CLONE CODING