Python - 얕은 복사(shallow copy)와 깊은 복사(deep copy)

Tasic·2021년 4월 21일
0

Python

목록 보기
2/7
post-thumbnail

💡 이 글은 아래 링크를 참조하여 작성하였습니다.
copy - Shallow and deep copy operations - Python 3.9.4 documentation

파이썬의 얕은 복사, 깊은 복사의 대한 개념에 대해서 정리하였습니다.

얕은 복사(Shallow copy)

새로운 복합 객체를 만들고,(가능한 범위까지) 원본 객체를 가리키는 참조를 새로운 복합 객체에 삽입합니다.

깊은 복사(Deep copy)

새로운 복합 객체를 만들고,재귀적으로 원본 객체의 사본을 새로 만든 복합 객체에 삽입합니다.

참고

얕은 복사와 깊은 복사의 차이점은 복합 객체(리스트 또는 클래스 인스턴스들과 같은 다른 객체를 포함한 객체)에만 유효합니다.

테스트

테스트의 사용한 객체의 의미는 아래와 같습니다.

ori : target안에 포함된 객체
a : target
b : 얕은 복사 결과
c : 깊은 복사 결과

Case1 : mutable 객체안에 mutable 객체가 포함되어 있을 시

Shallow copy : 복사대상은 새로운 공간에 할당되지만 대상안에 있는 요소는 원본과 동일 대상을 참조합니다.
Deep copy : 복사대상 뿐만 아니라 대상안에 있는 요소들도 새로운 공간에 할당됩니다.
Test Link

ori = [1,2]
a = [ori, 3]
b = copy.copy(a)
c = copy.deepcopy(a)

Case2 : immutable 객체안에 mutable객체가 포함되어 있을 시

Shallow copy : =(Assignment) 처럼 동작합니다.

Deep copy : 복사대상 뿐만 아니라 대상안에 있는 요소들도 새로운 공간에 할당됩니다.

ori = [1,2]
a = (ori, 3)
b = copy.copy(a)
c = copy.deepcopy(a)

Test Link

Case3 : immutable 객체안에 immutable객체가 포함되어 있을 시

Shallow copy, Deep copy 동일하게 =(Assignment) 처럼 동작합니다.
Test Link

ori = (1,2)
a = (ori, 3)
b = copy.copy(a)
c = copy.deepcopy(a)

객체가 immutable로만 구성되어 있는 경우 변경할 수 없으니, 굳이 새로운 공간을 만들지 않는 것으로 생각됩니다.

Case4 : mutable 객체안에 immutable객체가 포함되어 있을 시

Shallow copy, Shallow copy 복사대상은 새로운 공간에 할당되지만 대상안에 있는 요소는 원본과 동일 대상을 참조합니다.

ori = (1,2)
a = [ori, 3]
b = copy.copy(a)
c = copy.deepcopy(a)

Test Link

사용자 Class의 경우

import copy

class MyClass:
    def __init__(self):
        self.listValue = [1,2]
        self.tupleValue = (1,2)

a = MyClass()
b = copy.copy(a)
c = copy.deepcopy(a)

Shallow copy

class안에 있는 mutable객체인 listValue는 원본과 동일 대상을 참조합니다.

Deep copy

class안에 있는 mutable객체인 listValue의 대한 새로운 사본을 만듭니다.

요약

  1. deep copy target이 mutable 일 경우
    - target : 원본과 같은 참조
    - target의 포함된 객체 중 mutable 객체는 새로운 사본을 생성
    - target의 포함된 객체 중 immutable 객체는 원본과 같은 참조
  2. deep copy target이 immutable 일 경우
    - target의 포함된 객체 중 mutable 객체가 있으면 target은 새로운 사본을 생성
    - target의 포함된 객체 중 mutable객체가 없다면 target은 원본과 같은 참조
  1. shallow copy target이 mutable 일 경우
    - target : 새로운 사본을 생성
    - target의 포함된 객체 : 원본과 같은 참조

  2. shallow copy target이 immutable 일 경우
    - target : 원본과 같은 참조
    - target의 포함된 객체 : 원본과 같은 참조

  3. immutable로만 구성된 객체일 경우
    - 수정 불가하므로 새로운 공간을 만들지 않는 것으로 예상하며, =(Assignment)와 같게 동작합니다.
    - deep, shallow copy 동일 함.

  4. 사용자 class 같은 개념으로 적용됨.

마치며

테스트 하던 도중 여러 case가 있어서 정리하였으나, 객체안에 mutable 객체가 포함된 경우가 일반적인 상황이지 않을까 싶습니다. (case1, 2)

profile
블로그 옮겼습니다 (https://jotasic.github.io)

1개의 댓글

comment-user-thumbnail
2022년 7월 27일

파이썬 copy에 대해서 document보다 더욱 상세하고 쉽게 정리가 되었네요. 실제로 테스트 해보니 작성해주신것과 동일하게 동작하는거 확인했습니다. 내용 감사합니다.

답글 달기