[python] Tech(2) 깊은 복사, 얕은 복사 (deep copy, shallow copy)

Min Kim·2023년 3월 11일

Python

목록 보기
2/2

들어가기 전에


깊은 복사와 얕은 복사에 대해 알아봅시다.

1. 개념 비교


Video Label

  • 할당 : 객체 a에 대해 b=a라 하면 b는 a의 사본을 만들지 않고 참조 (단순 할당)

    • a와 b는 사실상 같은 List다 (a is b -> True)
    • 따라서 a.append()를 하면 b도 추가됨 (b는 a객체의 주소를 참조)
  • 얕은 복사 : 새 복합 객체를 만들고 원본 객체 내에 있는 오브젝트에 대한 참조를 삽입
    b = a[:]b=a.copy()라 하면 a를 복사한 객체를 생성하고 b가 참조함 (서로 참조하는 객체들의 주소가 같음)

    • a나 b에 append를 해도 서로 영향 받지 않음
    • a is b는 false 지만 a == b는 True (같은 요소의 주소를 참조)
  • 깊은 복사 : 리스트나 클래스의 인스턴스와 같은 복합 객체에 대해서만 적용, 새 복합 객체를 만들고 원본 객체 내에 있는 객체에 대한 복사를 재귀적으로 삽입
    copy 모듈의 deepcopy() 함수를 이용

    • 재귀적인 객체에 대한 재귀 루프를 피하며 복사할 수 있음

😜 추가 지식

  • 튜플은 변경 불가능한 객체이기에 할당은 되지만 복사는 안됨

2.그림으로 보는 얕은 복사


import copy

a = [1, 2, [3, 4]]
b = copy.copy(a)

b[2].append(5)

print(b)
-> [1, 2, [3, 4, 5]]
print(a)
-> [1, 2, [3, 4, 5]]
  • 위 코드의 객체 과정을 그림으로 확인
    처음 복사 상태

이중 배열 구조가 아닌 상태의 복사 변경 시

이중 배열 구조의 복사 변경 시

3. 그림으로 보는 깊은 복사


import copy

a = [1, 2, [3, 4]]
b = copy.deepcopy(a)

b[2].append(5)

print(b)
-> [1, 2, [3, 4, 5]]
print(a)
-> [1, 2, [3, 4]]
  • 위 코드의 객체 과정을 그림으로 확인
    재귀의 내용까지 복사가 된 형태에서 수정 시

참고


해당 사이트의 내용과 참고 서적을 참고로 작성했습니다. 추후에 더 알게 되는 내용들을 추가하겠습니다.

01-3 할당, 얕은 복사와 깊은 복사 (널널한 교수의 고급 파이썬) ft. 파이썬 코딩
[Python] 할당과 복사 / 얕은 복사, 깊은 복사 (shallow copy, deep copy)

profile
Better & Better 꾸준히 성장하는 개발자

0개의 댓글