출처 : 윤성우의 열혈 파이썬 : 중급
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 객체를 대상으로는 깊은 복사가 진행되었다
'프로그래머 > Python' 카테고리의 다른 글
[윤성우의 열혈 파이썬 중급편] 05. Iterable 객체와 Iterator 객체 (0) | 2020.12.15 |
---|---|
[윤성우의 열혈 파이썬 중급편] 04. list comprehension (0) | 2020.12.15 |
[윤성우의 열혈 파이썬 중급편] 02. 수정 가능한 객체와 수정 불가능한 객체 (0) | 2020.12.15 |
[윤성우의 열혈 파이썬 중급편] 01. reference count와 garbage collection (0) | 2020.12.15 |
[Effective Python 복습] Chapter 8. 제품화 (0) | 2020.12.13 |