■ 깊은 복사 (라이브러리 사용)
깊은 복사를 간단히 사용하는 방법은 import copy후 copy라이브러리의 deepcopy함수를 활용하는 것이다.
위 사진에서 볼 수 있듯이 deepcopy를 할 경우 내부 객체임에도 불구하고 a[0]과 b[0]의 주소값이 다른 서로 독립된 객체인 것을 확인할 수 있다. a[0][0]과 b[0][0]은 앞서 공부한 정수 객체 풀에 의해 같은 주소를 참조하고 있는 것이 정상이다.
Deep Copy(깊은 복사)라면 B의 내부 객체의 원소 값을 변경해도 A의 동일 인덱스의 객체의 요소 값이 변경되면 안된다
b[0][0]에다 7을 대입해주고 객체의 값과 주소값들을 확인했다.
b[0][0]의 값이 1 -> 7로, 주소값이 140715323527976 -> 1407153323528168로 변경된 것을 확인했다.
그 와중에 a[0][0]의 값과 주소 값은 변하지 않은 것을 확인했다.
■ 깊은 복사 (구현)
깊은 복사를 구현해봤다. 이를 분해해서 설명해보자면
(1) 파라미터의 타입이 행렬리스트인지 벡터리스트인지 확인한다.
행렬 리스트는 리스트 내에 또 다른 리스트가 존재하는 2차원 리스트이고
벡터 리스트는 구성 원소가 숫자, 문자 등으로만 존재하는 1차원 리스트이다.
(2) 행렬 리스트 같은 경우 행(row)과 열(column)의 길이값을 매개 변수로 영행렬을 반환받은 후
덮어 씌워주는 구조이다.
* 영행렬 (Zero Matrix, Null Matrix)
: 행렬 내의 구성 요소가 모두 0인 행렬.
* 영행렬 함수 |
Z이름의 리스트를 새로 생성해준뒤 매개 변수로 받은 행과 열의 길이만큼 0을 append해주는 함수이다. |
(3) 벡터 리스트일 때 실행되는 코드다. 1차원이기 때문에 가로, 즉 row(행) 의 길이만 알면된다.
■ 구현한 깊은 복사 사용
깊은 복사를 구현했으니 사용을 해봤다. 모든 행(row)의 첫번째 열(column)에 해당하는 값들을 변경해줬고
깊은 복사 대상이였던 A의 상태 변화를 확인해봤다. 변경 대상인 B만 변화가 있었고 A에는 아무런 영향이 없는 것을 확인했다.
카피 후 주소값을 확인해봤다. 내부 객체인 A[0]과 B[0]의 주소값이 동일하지 않은 것을 확인했다.
[만일 Deep Copy가 아닐 경우]
만약 얕은 복사를 할 경우, 위와 반대로, 내부 객체 (A[0]와 B[0])들의 주소값들이 동일한 것을 확인 할 수 있다.
'개발 (언어) > Python' 카테고리의 다른 글
[Python] Custom Library (0) | 2023.04.25 |
---|---|
[Python] 함수, (Im)mutable, 얕은 복사 (0) | 2023.04.25 |
[Python] 조건문, 반복문, Range, Reversed (0) | 2023.04.22 |
[Python] Jupyter Notebook 테마 변경 (0) | 2023.04.22 |
[Python] Bool, 조건 연산자 (0) | 2023.04.22 |