본문 바로가기

프로그래머/Python

[윤성우의 열혈 파이썬 중급편] 03. 깊은 복사와 얕은 복사

출처 : 윤성우의 열혈 파이썬 : 중급

03. 깊은 복사와 얕은 복사

  • v1 == v2 : 두 변수가 참조하는 객체의 내용이 같은가?
  • v1 is v2 : 두 변수가 참조하는 객체는 동일 객체인가?
r1 = [1, 2, 3]
r2 = [1, 2, 3]
r1 is r2    # False
r1 == r2    # True

r1 = [1, 2, 3]
r2 = r1
r1 is r2    # True

r1 = ['John', ('man', 'USA'), [175, 23]]
r2 = list(r1)
r1 is r2        # False
r1[0] is r2[0]  # T
r1[1] is r2[1]  # T
r1[2] is r2[2]  # T
  • 리스트는 각 값들을 (객체) 리스트 내에서 참조하는 형태이다
  • 위와 같은 형태의 복사를 얕은 복사라고 한다
  • 얕은 복사는 파이썬이 복사를 진행하는 기본 방식이다
  • immutable 객체의 경우 얕은 복사를 해도 문제가 되지 않는다
  • mutable 객체를 대상으로 얕은 복사를 하는 것은 문제가 될 수 있다

깊은 복사

J2021 = ['John', ('man', 'USA'), [175, 23]]
J2022 = list(J2021)
J2022[2][1] += 1
print(J2021)    # ['John', ('man', 'USA'), [175, 24]]
print(J2022)    # ['John', ('man', 'USA'), [175, 24]]

J2021 = ['John', ('man', 'USA'), [175, 23]]
J2022 = copy.deepcopy(J2021)
J2022[2][1] += 1
print(J2021)    # ['John', ('man', 'USA'), [175, 23]]
print(J2022)    # ['John', ('man', 'USA'), [175, 24]]
  • mutable 객체에 저장된 값들은 변경될 수 있기 때문에 이들에 대해서는 복사 대상을 하나 더 생성하는 깊은 복사를 해야 한다
  • deepcopy 함수의 호출 결과로 immutable 객체를 대상으로는 얕은 복사가 진행되었고, mutable 객체를 대상으로는 깊은 복사가 진행되었다