얕은 복사(shallow copy)와 깊은 복사(deep copy)

  • 리스트 예시

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    li = [1, 2, 3]
    # 참조(reference). 둘은 완벽하게 같은 객체.

    li2 = li
    li2
    >> [1, 2, 3]

    li2.append(4)
    li
    >> [1, 2, 3, 4]
  1. 얕은 복사(shallow copy)

    • 얕은 복사를 하면 공간을 복사해서 다른 공간이 생긴다.
    • 하지만 바라보고 있는 대상이 리스트 안에 리스트일 경우는 다르다.
      • 이름 객체가 같은 곳을 바라보고 있기 때문에 기존 대상과 같이 바뀌게 된다.
    • pythontutor.com을 통해 이해하자.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      li3 = li.copy()  # 얕은 복사
      li3
      >> [1, 2, 3, 4]


      li3.append(5)
      li3
      >> [1, 2, 3, 4, 5]


      li
      >> [1, 2, 3, 4]


      # 리스트 안에 리스트를 넣을 경우
      li = [1, 2, 3, 4, [6, 7]]

      li3 = li.copy() # 얕은 복사
      li3
      >> [1, 2, 3, 4, [6, 7]]


      # 리스트 안에 리스트에 요소 값 추가
      li3[4].append(8)
      li3
      >> [1, 2, 3, 4, [6, 7, 8]]


      # 원래 있던 리스트 안 리스트도 바뀜
      li
      >> [1, 2, 3, 4, [6, 7, 8]]
  2. 깊은 복사(deep copy)

    • 깊은 복사를 하면 완전히 다른 객체를 만들어버린다.
    • 기존 대상이 복사한 대상과 같지 않다.
    • pythontutor.com을 통해 이해하자.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      import copy

      li4 = copy.deepcopy(li) # 깊은 복사
      li4
      >> [1, 2, 3, 4, [6, 7, 8]]


      li4[4][1] = 10
      li4
      >> [1, 2, 3, 4, [6, 10, 8]]


      li
      >> [1, 2, 3, 4, [6, 7, 8]]
Share