본문 바로가기
Language/python

[Python] Deep copy & shallow copy

by 모너아링 2023. 4. 11.

Deep copy & shallow copy

mutable container인 list, set, dictionary 를 immutable 한 클래스를 만들기 위한 방법

 

Shallow copy

b = a

  • a와 b가 동일한 메모리 주소를 가짐
  • 내부의 객체 또한 동일한 메모리 주소
# shallow copy
a = [0, 1, [10, 20]]
**b = a # 첫 번째 방법**         
b[0] = 'hello'
b[-1][0] *= -1
print(a, b) # a = ['hello', 1, [-10, 20]], b = ['hello', 1, [-10, 20]]
print(id(a), id(b)) # 동일한 아이디 값
print(id(a[2]), id(b[2])) # 내부의 리스트를 아이디 값이 같다

 

b = a[:]

  • a와 b가 다른 메모리 주소를 가짐
  • 내부의 객체는 동일한 메모리 주소
a = [0, 1, [10, 20]]
**b = a[:] # 두 번째 방법**
b[0] = 'hello'
b[-1][0] *= -1
print(a, b) # a = [0, 1, [-10, 20]], b = ['hello', 1, [-10, 20]]
print(id(a), id(b)) # a와 b의 아이디 값이 다름
print(id(a[2]), id(b[2])) # 내부의 리스트를 아이디 값이 같다

 

b = copy.copy(a)

  • a와 b가 다른 메모리 주소를 가짐
  • 내부의 객체는 동일한 메모리 주소
import copy
a = [0, 1, [10, 20]]
**b = copy.copy(a) # 세 번째 방법**
b[0] = 'hello'
b[-1][0] *= -1
print(a, b) # a = [0, 1, [-10, 20]], b = ['hello', 1, [-10, 20]]
print(id(a), id(b)) # a와 b의 아이디 값이 다름
print(id(a[2]), id(b[2])) # 내부의 리스트를 아이디 값이 같다

 

deep copy

b = copy.deepcopy(a)

  • a와 b가 다른 메모리 주소를 가짐
  • 내부의 객체는 각각 다른 메모리 주소
# deep copy
import copy
a = [0, 1, [10, 20]]
b = copy.deepcopy(a)
b[0] = 'hello'
b[-1][0] *= -1
print(a, b) # a = [0, 1, [10, 20]], b = ['hello', 1, [-10, 20]]
print(id(a), id(b)) # a와 b의 아이디 값이 다름
print(id(a[2]), id(b[2])) # 내부의 리스트의 아이디 값 또한 다름

 

'Language > python' 카테고리의 다른 글

[Python] Dictionary  (0) 2023.04.11
[Python] Set  (0) 2023.04.11
[Python] Tuple  (0) 2023.04.11
[Python] List  (0) 2023.04.11
[Python] 2차원 리스트 정렬  (0) 2023.03.19