본문 바로가기

프로그래밍언어/Python

[Python] copy

반응형

1. copy

파이썬에서 대입문을 통해 객체를 입력하는 경우에는 객체를 복사하는 것이 아니라 객체의 주소를 참조하도록 바인딩해준다. 만약 복사하려는 객체가 가변객체인 경우에는 복사를 통해서 복사본은 수정하고 원본은 유지하도록 하는 방식이 필요한 경우가 있다. copy 모듈은 기본적인 얕은 복사와 깊은 복사 연산을 제공해준다.


2. interfaces

- copy.copy(x): 객체 x의 얕은 복사를 반환한다.
- copy.deepcopy(x[. memo]): 객체 x의 깊은 복사를 반환한다.

얕은 복사와 깊은 복사의 차이는 리스트나 클래스 인스턴스와 같이 객체 내부에 또다른 객체를 포함하고 있는 경우에 나타난다. 얕은 복사는 새로운 객체를 생성하여 내부에 원본의 객체들과 연결된 참조를 저장하여 반환한다. 반면에 깊은 복사는 원본 내부에 있는 객체들도 반복적으로 복사하여 참조가 아닌 새로운 객체로 저장하여 반환한다.

깊은 복사의 경우에는 얕은 복사와 달리 반복 루프의 문제가 발생할 수 있다. 원본 객체 내부에 있는 객체들도 반복적으로 복사를 수행하는 과정에서 복사본 간에 공유하는 데이터와 같이 너무 많은 데이터를 복사하는 경우가 발생하기 때문이다.

deepcopy 에서는 memo 딕셔너리를 가지고 있는데, 이 딕셔너리에 복사 과정에서 이미 복사된 값을 저장하도록 하여 위의 문제를 해결합니다. 또한 사용자 정의 클래스에서는 copy, deepcopy 를 재정의하도록 하여 모든 데이터를 복사하는 문제를 방지할 수 있습니다.


3. __copy__(), __deepcopy__()

사용자 정의 클래스에서 새로운 copy 방식을 구현하기 위해서는 __copy__, __deepcopy__ 두개의 special method 를 사용할 수 있다. 이 메서드들을 구현하게 되면 copy.copy(), copy.deepcopy() 시에 구현한 메서드들로 오버라이딩 되어 실행된다.

__copy__() 메서드는 아무런 매개변수가 없고, __deepcopy__(memo) 의 경우에는 memo 매개변수를 가지고 있다. deepcopy 구현 시에는 내부 객체를 복사하기 위해서 deepcopy() 메서드를 호출하여 구현하여도 된다.

// deepcopy 구현 예제
import copy
import object

// deepcopy 호출 시에 해당 객체에서 _id, _name, _number 를 복사한 객체를 반환한다.
def __deepcopy__(self, memo):
obj = object.__new__(self.__class__)
obj._id = copy.deepcopy(self._id, memo)
obj._name = copy.deepcopy(self._name, memo)
obj._number = copy.deepcopy(self._number, memo)
return obj

 

 

[reference]
- https://docs.python.org/3/library/copy.html?highlight=__deepcopy__#module-copy 

 

copy — Shallow and deep copy operations — Python 3.10.2 documentation

copy — Shallow and deep copy operations Source code: Lib/copy.py Assignment statements in Python do not copy objects, they create bindings between a target and an object. For collections that are mutable or contain mutable items, a copy is sometimes need

docs.python.org

 

반응형