개발 언어/Python

깊은 복사(deep copy)와 얕은 복사(shallow copy)

hong2943 2024. 5. 5. 17:46
얕은 복사와 깊은 복사는 객체가 중첩되는 경우에 사용된다.

얕은 복사

  • 객체의 주소만을 복사하는 것으로 원본 객체와 복사본 객체는 같은 주소를 참조한다.
  • copy 모듈의 copy() 메소드
import copy

original_list = [[1, 2, 3], [4, 5, 6]]
copied_list = copy.copy(original_list)

original_list[0][0] = 100  # 원본 객체의 값을 변경
print("Original List:", original_list)  # [[100, 2, 3], [4, 5, 6]]
print("Copied List:", copied_list)      # [[100, 2, 3], [4, 5, 6]]
  • 예시 코드에서 원본 리스트의 값을 변경했는데 복사본 리스트까지 같이 함께 변경되는 것을 확인할 수 있다. 이는 위에서 설명한 바와 같이 원본 객체와 복사본 객체가 같은 중첩된 객체를 참조하기 때문이다.

깊은 복사

  • 객체와 그 안에 있는 모든 객체들을 새롭게 복사하는 것이다.
  • 깊은 복사를 하게되면 원본 객체와 복사본 객체는 완전히 독립된 객체가 된다.
  • copy 모듈의 deepcopy() 메소드
import copy

original_list = [[1, 2, 3], [4, 5, 6]]
deep_copied_list = copy.deepcopy(original_list)

original_list[0][0] = 100  # 원본 객체의 값을 변경
print("Original List:", original_list)   # [[100, 2, 3], [4, 5, 6]]
print("Deep Copied List:", deep_copied_list)  # [[1, 2, 3], [4, 5, 6]]
  • 예시 코드에서 원본 리스트의 값을 변경했는데 복사본 리스트는 값이 변경되지 않았다.
  • 이는 원본 리스트와 복사본 리스트는 독립된 객체이기 때문이다.

사용되는 상황

  • 객체의 불변성 보장이 필요한 경우
    • 얕은 복사
      • 객체가 불변적인 경우에는 얕은 복사로 충분할 수 있다.
    • 깊은 복사
      • 객체가 가변적이고, 원본과 복사본 간의 완전한 독립성이 보장된 경우에는 깊은 복사를 사용해야 한다.
  • 성능 및 메모리 사용량 고려
    • 얕은 복사
      • 얕은 복사는 객체가 크고 복잡한 경우에 효율적일 수 있다.
    • 깊은 복사
      • 깊은 복사는 모든 객체를 완전히 복사하기 때문에 메모리 사용량이 증가한다.
      • 따라서 객체가 작고 간단하며, 완전한 독립성이 필요한 경우 사용하는 것이 좋다.

 

성능 및 메모리 사용량 등 상황에 맞게 적절히 판단하여 효율적으로 사용하는 것이 좋다.

'개발 언어 > Python' 카테고리의 다른 글

아스키코드 사용법  (0) 2024.05.11
immutable과 mutable 객체란?  (0) 2024.05.05
join사용법 및 join을 사용하기 좋은 상황  (0) 2024.04.29
파이썬에서 2차원 리스트를 다뤄보자  (0) 2024.04.05
람다식 정렬  (0) 2024.04.05