파이썬에는 얕은 복사(shallow copy)와 깊은 복사(Deep copy)가 존재한다. 그리고 이를 지원하기 위해 copy 모듈이 존재한다.
copy 라이브러리
- 파이썬에는 얕은 복사와 깊은 복사를 수행하기 위해 표준 라이브러리에서 copy 라이브러리를 제공한다.
- 이 라이브러리는 모듈,메서드,스텍트레이스,스텍프라임,파일,소켓,윈도우,배열,혹은 유사한 타입들에 대해서는 복사를 수행하지 않는다.
copy.copy(x)
copy.deepcopy(x[,memo])
exception copy.error
- 이 모듈을 사용할 때 오류가 발생하는 경우에 일어나는 예외이다.
얕은 복사(shallow copy)의 개념
- 얕은 복사는 새로운 객체(변수)를 만든 후에 원본에 접근할 수 있는 참조(reference)를 입력한다.
👉🏽 이런 경우 서로 다른 변수명이지만 본질적으로 서로 같은 대상을 의미하므로 하나의 변수 역시 수정이 된다.
- 가변형(mutable) 자료형에 대해서 적용이 가능하다.
👉🏽 가변형(mutable) 자료형은 같은 주소에서 값(value)이 변경 가능하기 때문에 얕은 복사가 가능하다.
👉🏽 불변형(immutable) 자료형은 본질적으로 변경이 불가능하므로 재배정을 통해 변수를 바꾼다. 따라서 재배정이 이루어지므로 객체가 서로 달라진다.
깊은 복사(deep copy)의 개념
- 깊은 복사는 새로운 객체(변수)를 만든 뒤에 원본의 복사본을 변수에 입력한다.
👉🏽 서로 값만 같을 뿐 본질적으로 서로 다르기 때문에 한 변수가 수정될 시 다은 변수가 수정되지 않는다.
얕은 복사,깊은 복사의 예제
먼저 import copy를 하고 변수에 값을 할당한다.
불변형 자료의 변경
가변형 자료의 변경
가변형 자료 안, 불변형 자료의 변경
예제를 통해
- 불변형(immutable) 자료형을 변경했을 경우에는 재배정이 이루어지기 때문에 얕은 복사와 깊은 복사 모두 변경되지 않는 것을 볼 수 있다.
- 가변형(mutable) 자료형을 변경했을 경우에는 걑은 복사에서는 같이 변경되나 깊은 복사에서는 변경되지 않는 것을 볼 수 있다.
- 가변형 자료안에 불변형 자료를 변경했을 경우에는 얕은 복사에서는 같이 변경이 되고 깊은 복사에서는 변경되지 않는 것을 볼 수 있다.
배정 구문(Assignment statement)
배정 구문을 사용하는 것은 복사본을 만든다는 것과는 개념이 다르다
👉🏽 배정 구문은 엄밀히 말하면 복사본을 만드는 것이 아니라, 타겟과 오브젝트를 엮는 역할을 한다라는 표현이 좀 더 적합하다.
👉🏽 그래도 비슷한 부분이 있고 잘못 사용할 가능성이 있기 때문에 조심해야 한다.
배정 구문의 예제
할당과 배정
각 변수의 주소 출력, 같은 객체임을 확인
변수 하나 변경시 다른 객체의 상태 확인
재배정을 하면 다른 객체가 됨을 확인
배정을 다르게 하면 일어나는 일 확인
할당과 배정
서로 다른 객체임을 확인
변수 하나 변경시 다른 객체의 상태 확인
예제를 통해 알아낸 사실은
깊은 복사를 하고 싶으면 복사의 방법을 다르게 하거나 copy 모듈을 써야한다는 것이다.
mutable한 객체의 변수 간 대입에서는
b 에 a를 할당하면 값이 할당되는 것이 아니라 같은 메모리 주소를 바라보고
b를 변경하면 같이 a도 바뀐다는 것을 알 수 있었다.
mutable한 다른 객체 또한 똑같은 현상이 나타난다.
immutable한 객체의 변수간 대입에서는
list와 똑같이 b를 a에 할당하면 같은 메모리 주소를 바라보게 된다.
하지만 b에 다른 값을 할당하면 재할당이 이루어지며 메모리 주소가 변경
고로 a와 b는 다른 값을 가진다.