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 |