[플레이데이터 빅데이터 부트캠프]Python 깊은 복사 vs 얕은 복사

얕은복사(주소복사)

  • 변수 이름은 다르지만 결국 동일한 주소를 나타내는 경우이다.(시퀸스 타입은 얕은복사를 기본으로 하고 있다.)
  • 결국 두 변수는 같은 변수나 다름없다.
  • 공간 효율성, 메모리 효율성 때문에, 주소를 복사해서 사용을 하는 얕은 복사를 파이썬은 기본 복사로 차용하고 있다.
 arr = [10, 20, 30]
 # arr의 내용을 copy1이라는 새로운 변수명을 가진 리스트로 복사해주세요
 copy1 = arr
 [10, 20 , 30]
 
 print(id(copy1), id(arr))  # 얕은 복사 / shallow copy / 주소 복사
 140682201559680 140682201559680
 
 copy2[2] = 156
 copy2
 [10, 20, 156]
 
 arr
 [10, 20, 156]

실습1 

import random
c = random.sample(range(1, 26), k=6)

d = c # shallow copy
c, d
([3, 12, 11, 6, 9, 23], [3, 12, 11, 6, 9, 23])

c[1] = 5
c, d
id(c), id(d)
(140682201453984, 140682201453984)​

깊은복사

  • 파이썬에서는 깊은 복사라는 다른 방법을 제공해서 시퀸스타입의 깊이가 깊어질 때,
  • 메모리 주소를 참조해서 원본을 훼손하는 일을 막고 있다.
  • decopy 사용하려면, copy라는 모듈의 deepcopy()를 사용해야 한다.

실습2

import random

import copy
a = random.sample(range(1, 26), k=6)
b = copy.deepcopy(a)
print(id(a), id(b))
print(a, b)
b[1] = 5
print(a, b) # deepcopy

140682201561360 140682201730336
[21, 6, 19, 1, 24, 20] [21, 6, 19, 1, 24, 20]
[21, 6, 19, 1, 24, 20] [21, 5, 19, 1, 24, 20]​

deepcopy() 모듈을 사용하면, 원본 훼손을 막을 수 있는 것을 확인할 수 있다.