[코테] 얕은 복사(shallow copy) vs 깊은 복사(deep copy)

하나·2022년 1월 31일
0

코딩테스트

목록 보기
5/16

1. mutable과 immutable 객체

객체에는 mutable한 객체와 immutable 한 객체가 있다.

  • 객체 구분 표

-> mutable 한 객체에는 list, set, dict 이 있다.

mutable 한 객체는 원소를 변경해도 변수의 메모리 주소값은 변하지 않는다.

2. 변수 간 대입

mutable한 객체의 변수 간 대입

  • b에 a 를 할당하면 b를 변경 시 a도 변경됨.
  • 값이 할당되는 것이 아니라 같은 메모리 주소를 바라봄.
a = [1,2,3]
b =a # shallow copy
b[0] = 5
a # [5,2,3]
b # [5,2,3]
id(a) # 4396179528
id(b) # 4396179528

immutable한 객체의 변수 간 대입

  • list와 동일하게 b를 a에 할당하면 같은 메모리 주소를 바라보게 됨.
  • b에 다른 값을 할당하면 재할당이 이루어져 메모리 주소가 변경 됨.
a = 'abc'
b = a
a # 'abc'
b # 'abc'
id(a) # 4387454680
id(b) # 4387454680

b = "abcd"
a # 'abc'
b # 'abcd'
id(a) # 4387454680
id(b) # 4396456400

얕은 복사 (shallow copy)

a = [1,2,3]
b = a[:]
id(a) # 4396179528
id(b) # 4393788808
a == b # True
a is b # False
b[0] = 5
a # [1,2,3]
b # [5,2,3]
  • 슬라이싱은 얕은 복사에 해당됨.
  • 리스트 안에 리스트, mutable 객체 안에 mutable 객체인 경우 -> id(a) 값과 id(b) 값은 다르지만, 그 내부의 객체 id(a[0]) 과 id(b[0]) 은 같은 주소를 바라봄.
a = [[1,2], [3,4]]
b = a[:]
id(a) # 4395624328
id(b) # 4396179592
id(a[0]) # 4396116040
id(b[0]) # 4396116040
  • copy 모듈의 copy 메소드 또한 얕은 복사에 해당됨.
import copy
a = [[1,2],[3,4]]
b = copy.copy(a)
a[1].append(5)
a # [[1, 2], [3, 4, 5]]
b # [[1, 2], [3, 4, 5]]

깊은 복사 (Deep copy)

  • 깊은 복사는 내부 객체들까지 모두 새롭게 copy
  • copy.deepcopy 메소드
import copy
a = [[1,2],[3,4]]
b = copy.deepcopy(a)
a[1].append(5)
a # [[1, 2], [3, 4, 5]]
b # [[1, 2], [3, 4]]

얕은 복사 : 객체를 새로운 객체로 복사하지만 원본 객체의 주소값을 복사하는 것
깊은 복사 : 전체 복사로 참조값의 복사가 아닌 참조된 객체 자체를 복사하는 것
코딩을 하다보면 원본 배열의 보존을 할 필요가 있기 때문에 이럴때는 배열을 '깊은 복사' 해야 함.

참고 : https://crackerjacks.tistory.com/14
https://wikidocs.net/16038

0개의 댓글