얕은복사 / 깊은복사

JoyJuhee·2022년 7월 6일
0

Python

목록 보기
2/22
post-thumbnail

1. 얕은 복사

: 변수를 복사했다고 생각했지만 실제로는 연결되어 있는 것을 의미한다.
👉 변수를 복사했지만 참조한 곳은 동일하기 때문에 같은 변수를 가리키고 있다.

📍 예시
arr1 = [1,2,3]
arr2 = arr1
--> 이렇게, '='을 통해 얕은복사를 했을때, 복사를 했다고 생각하지만 사실 복사한 것은 참조(메모리 주소)만 복사한 것이다.

그러므로, arr1에 append를 통해서 값을 추가한다면 arr2에도 동일하게 적용된다.

1) immutable한 객체(int, float 등)는 얕은복사든, 깊은복사든 상관이 없다.
--> 해당 객체들은 값이 변경되는 무조건 참조가 변경되기 때문에
--> 그러므로 파이썬에서는 얕은복사와 깊은복사를 구분하는 것은 mutable한 객체(list, set, dict)에만 해당된다.

2) 얕은복사의 방법

  • '=' 대입 연산자를 이용
  • [:] 슬라이싱을 이용한 얕은 복사
arr1 = [4,5,6,[2,4,8]]
arr2 = arr1[:]

arr2.append(22)

arr1[3].append(99)

👉 arr2.append(22)를 하게 되면, arr1 = [4,5,6,[2,4,8]] arr2 = [4,5,6,[2,4,8],22]로 두 리스트가 다르다는 것을 볼 수 있다.
근데, 왜 얕은 복사라고 하는가?
👉 리스트 내부에 있는 리스트에 값을 추가했을 때, arr1[3] = [2,4,8,99] 이고, arr2[3] = [2,4,8,99]가 된 것을 볼 수 있다.

👉 이는 완전한 깊은 복사도 아니고, 완전한 얕은 복사도 아니다. 그러나, 이 또한 얕은복사로 구분한다.

  • copy 메서드 이용
arr1 = [4, 5, 6, [2, 4, 8]]
arr2 = arr1.copy()  # 여기서 복사 copy 메소드 이용
  • copy 모듈의 copy 함수를 이용한 얕은 복사
import copy                 # copy 모듈 불러오기
print('=' * 50)

d1 = {'a': 'BlockDMask', 'b': [1, 2, 3]}
d2 = copy.copy(d1)      # copy 모듈 얕은복사

2. 깊은 복사 (deepcopy)

: 깊은 복사는 리스트 내부 리스트, 딕셔너리 내부 리스트 등 내부에 있는 객체 모두 새롭게 만들어주는 작업을 한다. (모든 것들이 새롭게 복사, 그냥 독립적이게 되어버림)

📍 예시

import copy                 # copy 모듈 불러오기
arr1 = [1, 2, [99, 88, 77], 3]
arr2 = copy.deepcopy(arr1)      # copy 모듈 깊은 복사

arr1.append(0)

arr1[2].append(10)

👉 arr1에 값을 추가해도 arr2에는 전혀 영향이 없다.


출처: https://blockdmask.tistory.com/576 [개발자 지망생:티스토리]

0개의 댓글