[파이썬] 얕은 복사와 깊은 복사

Bini by Bini·2023년 2월 13일
0

파이썬

목록 보기
3/4

들어가기 전에 ..

이전 포스팅 mutable, immutable 객체에 대한 이해가 있어야 한다.
https://velog.io/@hyooo1022/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%95%A8%EC%88%98%EC%9D%98-%EC%9D%B8%EC%9E%90-%EC%A0%84%EB%8B%AC

얕은 복사

Shallow Copy

얕은 복사는 변수를 복사했지만, 실제로는 연결되어 있는 것을 뜻한다.
즉 변수를 복사하긴 했지만 참조한 곳은 동일하기 때문에 같은 변수를 가리키고 있는 것이다.

그림으로 보면

arr1 = [1, 2, 3]
arr2 = arr1
위와 같이 리스트에 =으로 복사(얕은 복사)를 했다고 하면, 아래와 같은 그림이다.

복사했다고 생각했지만 사실 메모리 주소값만 복사한 것이고 실제 객체 전체를 복사한 것이 아니다.
따라서 여기서 arr1에 값을 append한다면 같은 곳을 참조하는 arr2에도 똑같이 적용된다.

-> 이렇게 복사를 했음에도 값을 변경하면 다른 변수에도 영향을 끼치도록 '참조'만을 복사한 것을 얕은 복사 라고 한다.


immutable 한 int, float과 같은 객체들은 얕은 복사든 깊은 복사든 상관없다.
이 객체들은 값이 변경되면 무조건 참조가 변경되기 때문이다.

num1 = 3
num2 = num1
위는 아래와 같은 그림이다.

num1과 num2가 3이라는 값을 가진 메모리 공간을 같이 참조한다.

이때 num1 = 4를 하면 immutable 객체는 값이 변경될 수 없으므로 새롭게 메모리를 할당해서 4라는 값을 생성하고 이곳을 num1이 참조하게 된다.

최종적으로 num1, num2가 다른 곳을 가르키게 된다.

따라서 파이썬에서 '얕은 복사' '깊은 복사'에 대해 구분하고 학습이 필요한 객체는
int, float과 같은 immutable 객체가 아니라
list, set, dictionary와 같은 mutable 객체이다.


얕은 복사하는 방법

mutable 객체의 얕은 복사 방법에는 네가지가 있다.

  1. '=' 대입 연산자를 이용한 얕은 복사

  2. [:] 슬라이싱을 이용한 얕은 복사

  3. copy 메서드
    ex. arr2 = arr1.copy()

  4. copy 모듈의 copy 함수
    import copy
    d2 = copy.copy(d1)


깊은 복사

깊은 복사는 리스트 내부 리스트, 딕셔너리 내부 리스트 등 내부에 있는 객체 모두 새롭게 만들어주는 작업을 한다.
모든 것을 새롭게 복사하여 독립적으로 만드는 행위!

깊은 복사하는 방법

깊은 복사를 하려면 copy 모듈의 deepcopy 함수를 사용해야 한다.
import copy
ex. arr2 = copy.deepcopy(arr1)


그림으로 정리

1. 얕은 복사 '='

2. 얕은 복사 '[:]'

3. 깊은 복사 copy.deepcopy

profile
My Precious Records

0개의 댓글