[Python] copy와 deepcopy

Hyun·2022년 8월 17일
0

Python

목록 보기
1/3

shallow copy

import copy
a = [[1,2], [3,4]]
b = copy.copy(a)
a[1].append(5)
print(id(a) == id(b))	# True

shallow copy할 때 mutable 객체라면 주소값을 복사한다.

  • immutable : 수정 불가능한 값

    • 복사한 값을 수정 시 다른 id값을 할당한다.
      a = 0
      b = a
      print(a, b)		# 0 0
      print(id(a) == id(b))	# True
    
      b = 2
      print(a, b)		# 0 2, Integer형 변수는 Immutable하므로 다른 id값 할당
      print(id(a) == id(b))	# False
  • mutable : 수정 가능한 값

    • 복사한 값을 수정 시 원본도 수정됨(복사한 값이 주소를 참조하기 때문)
    # mutable 예시
    a = [1, 2, 3, 4]
    b = a	# list의 주소값을 저장, b 수정시 
    print(a, b)		# [1, 2, 3, 4] [1, 2, 3, 4]
    print(id(a) == id(b))	# True
    
    b[0] = 0
    print(a, b)		# [0, 2, 3, 4] [0, 2, 3, 4]
    print(id(a) == id(b))	# True
    • 1차원 list의 경우 slice를 통해 복사하면 다른 id를 부여하여 해결 가능하다.
    a = [1, 2, 3]
    b = a[:]
    print(id(a) == id(b))	# False
    • mutable객체 안에 mutable 객체일 경우(예시 : [[1, 2], [2, 3]]) 바깥의 객체의 주소를 바꾸더라도 내부 객체의 주소값이 동일한 문제 발생
    a = [[1, 2], [3, 4]]
    b = a[:]
    print(id(a) == id(b))	# False
    print(id(a[0]) == id(b[0]))	# True
    • 재할당을 하여 주소값을 새로 부여하거나 deepcopy를 통해 새로운 주소값을 가지도록 copy할 수 있다.
    a = [[1, 2], [3, 4]]
    b = a[:]
    a[0] = [5,6]
    print(id(a) == id(b))	# False
    print(id(a[0]) == id(b[0]))	# False
    

Deep copy

mutable객체의 mutable한 내부의 객체들까지 모두 새롭게 copy되는 것(주소값을 새로 할당)

import copy
a = [[1,2], [3,4]]
b = copy.deepcopy(a)
a[1].append(5)
print(id(a) == id(b))	# False

0개의 댓글