Python 에서 List나 Query Set의 주소를 바꿔 복사를 해오려면 깊은 복사를 해야하는 줄 알았지만 얕은복사 만으로 커버가 가능했다.
안에 객체가 있는 경우에만 깊은 복사를 사용한다.
복사를 따지는 것은 mutable 객체일 때만 해당한다. immutable 객체는 값이 수정되는 것이 아니라 새로운 객체가 할당되는 것이기 때문
복사의 종류는 다음과 같이 3가지로 나눌 수 있다.
객체 복제
위와 같이 변수를 복사하면, 바라보는 객체가 동일하기 때문에 한 쪽에서 수정시 다른 쪽에서도 수정이 일어난다.
얕은 복사
얕은 복사를 하면 복합객체(리스트)는 별도로 생성하지만, 그 안에 들어가는 내용은 같은 객체를 참조함에 유의해야 한다. 참고로 copy.copy()이외에 slicing 으로도 얕은 복사를 할 수 있다.
깊은 복사
깊은 복사를 하면 내부에 있는 객체까지 다른 객체로 만든다.
그러나 깊은 복사는 시간 복잡도가 높기 때문에 꼭 필요할 때만 사용해야 한다.
- 10.59 sec (105.9us/itn) - copy.deepcopy(old_list)
- 0.325 sec (3.25us/itn) - for item in old_list: new_list.append(item)
- 0.217 sec (2.17us/itn) - [i for i in old_list] (a list comprehension)
- 0.186 sec (1.86us/itn) - copy.copy(old_list)
- 0.075 sec (0.75us/itn) - list(old_list)
- 0.053 sec (0.53us/itn) - new_list = []; new_list.extend(old_list)
- 0.039 sec (0.39us/itn) - old_list[:] (list slicing)
References
https://crackerjacks.tistory.com/14
https://blueshw.github.io/2016/01/20/shallow-copy-deep-copy/
'Python' 카테고리의 다른 글
Python - 커스텀 정렬 (0) | 2021.11.02 |
---|---|
Django - 다른 서버에 api 요청하기 (0) | 2021.10.14 |
Python - 정렬 커스터마이징 (0) | 2021.10.11 |
Python - list 특정 값 모든 원소 찾기 (0) | 2021.09.19 |
Python - List Comprehension [datum for datum in data if datum == 'valid'] (0) | 2021.09.08 |