Shallow Copy(for immutable object) vs. Deep Copy(for mutable object)

Hyungseop Lee·2024년 8월 13일
0
post-thumbnail

Github

https://github.com/LeeHyungSeop/Python-Syntax/blob/main/Intermediate/03_deep_shallow_copy.ipynb

두 object 비교

  • v1 == v2 : 변수 v1과 v2가 reference하는 object의 값이 같은가?
  • v1 is v2 : 변수 v1과 v2가 reference하는 object는 동일한 object인가?

list의 object reference

  • list를 생성하면 list 안에 선언되는 값들이 list에 들어가는 것이 아니라,
    값들이 저장되는 메모리 주소가 list에 저장된다.
    즉, 각 값(object)들을 list 내에서 reference한다.
    (아래 그림처럼)

Shallow Copy

r2 = list(r1)

위와 같은 복사를 Shallow Copy라고 한다.

  • Shallow Copy는 Python이 복사를 진행하는 기본 방식이다.
  • 사실 immutable object인 string object('John'), tuple object(('man', 'USA'))를 대상으로는 Shallow Copy를 해도 문제가 되지 않는다.
  • 그러나 mutable object인 list object([175, 23])를 대상으로 Shallow Copy를 하면 문제가 될 수 있다.

Deep Copy

  • 정리하면 immutable object는 Shallow Copy를 해도 문제가 되지 않지만, mutable object는 문제가 될 수 있다.

  • 아래 예제를 보자
    John은 해가 지날수록 나이를 먹는다.
    그래서 위의 예시에서는 2021년도 John의 정보를 복사하여 2022년도 John의 정보를 만들었다.
    그런데 Shallow Copy로 인해 2022년 John의 나이를 먹이면 2021년도 John의 나이도 먹게 된다.
    이렇듯 mutable object에 저장된 값들은 변경될 수 있기 때문에
    이들에 대해서는 복사 대상을 하나 더 생성하는 Deep Copy를 사용해야 한다.

  • 아래 그림과 같이 immutable object인 string('John')과 tuple(('man', 'USA'))는 Shallow Copy,
    mutable object인 list([175, 23])는 Deep Copy를 사용하는 것이 의도에 맞는 프로그래밍이다.
    또한 안정성과 성능을 모두 고려하여 Deep Copy를 사용하는 것이 좋다.

  • Deep Copycopy 모듈의 deepcopy 함수를 사용한다.

  • python은 memory를 효율적으로 사용하기 위해 '선한 거짓말'을 하고 있다.
    그러나 immutable object에 대한 상황에서는 문제가 없기 때문에 속아줘도 된다.
    단, mutable object에 대해서는 deepcopy를 사용해야 프로그래밍 의도에 맞게 안전하게 복사할 수 있다.

profile
Efficient Deep Learning

0개의 댓글