💡 이 글은 아래 링크를 참조하여 작성하였습니다.
copy - Shallow and deep copy operations - Python 3.9.4 documentation
파이썬의 얕은 복사, 깊은 복사의 대한 개념에 대해서 정리하였습니다.
새로운 복합 객체를 만들고,(가능한 범위까지) 원본 객체를 가리키는 참조를 새로운 복합 객체에 삽입합니다.
새로운 복합 객체를 만들고,재귀적으로 원본 객체의 사본을 새로 만든 복합 객체에 삽입합니다.
얕은 복사와 깊은 복사의 차이점은 복합 객체(리스트 또는 클래스 인스턴스들과 같은 다른 객체를 포함한 객체)에만 유효합니다.
테스트의 사용한 객체의 의미는 아래와 같습니다.
ori : target안에 포함된 객체
a : target
b : 얕은 복사 결과
c : 깊은 복사 결과
Shallow copy : 복사대상은 새로운 공간에 할당되지만 대상안에 있는 요소는 원본과 동일 대상을 참조합니다.
Deep copy : 복사대상 뿐만 아니라 대상안에 있는 요소들도 새로운 공간에 할당됩니다.
Test Link
ori = [1,2]
a = [ori, 3]
b = copy.copy(a)
c = copy.deepcopy(a)
Shallow copy : =(Assignment) 처럼 동작합니다.
Deep copy : 복사대상 뿐만 아니라 대상안에 있는 요소들도 새로운 공간에 할당됩니다.
ori = [1,2]
a = (ori, 3)
b = copy.copy(a)
c = copy.deepcopy(a)
Shallow copy, Deep copy 동일하게 =(Assignment) 처럼 동작합니다.
Test Link
ori = (1,2)
a = (ori, 3)
b = copy.copy(a)
c = copy.deepcopy(a)
객체가 immutable로만 구성되어 있는 경우 변경할 수 없으니, 굳이 새로운 공간을 만들지 않는 것으로 생각됩니다.
Shallow copy, Shallow copy 복사대상은 새로운 공간에 할당되지만 대상안에 있는 요소는 원본과 동일 대상을 참조합니다.
ori = (1,2)
a = [ori, 3]
b = copy.copy(a)
c = copy.deepcopy(a)
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)
class안에 있는 mutable객체인 listValue는 원본과 동일 대상을 참조합니다.
class안에 있는 mutable객체인 listValue의 대한 새로운 사본을 만듭니다.
shallow copy target이 mutable 일 경우
- target : 새로운 사본을 생성
- target의 포함된 객체 : 원본과 같은 참조
shallow copy target이 immutable 일 경우
- target : 원본과 같은 참조
- target의 포함된 객체 : 원본과 같은 참조
immutable로만 구성된 객체일 경우
- 수정 불가하므로 새로운 공간을 만들지 않는 것으로 예상하며, =(Assignment)와 같게 동작합니다.
- deep, shallow copy 동일 함.
사용자 class 같은 개념으로 적용됨.
테스트 하던 도중 여러 case가 있어서 정리하였으나, 객체안에 mutable 객체가 포함된 경우가 일반적인 상황이지 않을까 싶습니다. (case1, 2)
파이썬 copy에 대해서 document보다 더욱 상세하고 쉽게 정리가 되었네요. 실제로 테스트 해보니 작성해주신것과 동일하게 동작하는거 확인했습니다. 내용 감사합니다.