이 튜토리얼에서는 예제의 도움을 받아 파이썬 얕은 복사와 딥 복사 방법에 대해 알아보겠습니다.
할당 문(=)
Python에서 = 연산자를 사용하면 새로운 개체가 생성된다고 생각하지만 생성되지 않습니다. 원래 객체의 참조를 공유하는 새 변수만 생성합니다.
이 예에서 볼 수 있듯이 list1과 list1_copy는 모두 동일한 ID를 공유합니다. 따라서 list1 또는 list1_copy의 값을 수정하려고 하면 변경 사항이 다른 개체를 반영합니다.
토우 원래 값을 변경하지 않고 새 값만 수정하거나 그 반대로 수정하려는 경우 = 연산자를 사용하면 요구 사항을 충족할 수 없습니다. 이 경우 파이썬에서 복사본을 만드는 두 가지 방법이 있습니다.
- 딥 카피
- 얕은 복사
그 두 가지 방법을 사용하기 위해서는 먼저 복사 모듈을 수입해야 합니다.
얕은 복사
# Official Document
A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.
얕은 사본은 새 객체를 작성하고 원래 요소의 참조를 저장합니다. list2와 list2_copy는 같은 값을 가지지만 차이점 개체입니다.
복사 목록을 변경해도 원본 목록에는 영향이 없을 것 같습니다.
그러나 중첩된 객체에 대해 얕은 복사본을 만들면 새 객체의 요소가 원래 객체로 참조됩니다. 이 경우 원본 객체의 변경사항은 복사 객체에 반영되며, 그 반대의 경우도 마찬가지입니다.
위의 프로그램에서는 list2_copy, 즉 list2_copy[2][2] = 8을 변경했습니다. list2와 list2_copy가 [2][2]에서 모두 수정되었습니다. 그 이유는 두 리스트가 중첩된 동일한 객체의 참조를 공유하기 때문입니다.
딥 카피
# Official Document
A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.
복사 모듈에 있는 딥카피() 기능을 사용하여 이전 목록 복사 예를 반복하겠습니다. 전체 복사본은 원본 객체와 중첩된 모든 객체의 독립 사본을 작성합니다.
위의 프로그램에서 새 값을 list5에 할당하면 list5만 수정되고 list5_copy에 새 값을 할당하면 list5_copy만 수정됩니다. 이것은 독립성이 있다는 것을 의미합니다. 완전 복사 객체를 변경할 수 있지만 원본 객체는 변경되지 않습니다.
완전 복사하는 것이 더 느립니다.
위의 프로그램에서 우리는 10만 배 얕은 카피와 10만 배 깊은 카피를 만듭니다. 얕은 복사본을 만드는 데 70.9ms밖에 걸리지 않지만 딥 카피를 만드는 데는 1.58s가 걸립니다. 왜냐하면 딥 카피에서는 모든 객체에 대해 새로운 복사본을 만들고 있기 때문입니다.
결론
- 딥 카피는 원본과 완전히 독립적인 객체를 생성하지만 속도가 더 느립니다.
- 얕은 복사본은 하위 개체를 복제하지 않으므로 완전히 독립적이지 않습니다.
'프로그래밍' 카테고리의 다른 글
Fled 바코드 스캐너 만들기 (0) | 2021.12.30 |
---|---|
코딩하는 방법을 배우십시오. (0) | 2021.12.30 |
싱글톤 — 단일 인스턴스의 아름다움 (0) | 2021.12.30 |
컴퓨터 프로그래머가 되고 큰 돈을 벌기 위한 9가지 쉬운 단계 (0) | 2021.12.30 |
줄거리, 게임 컨셉, 게임 메카니즘 - 어떤 것이 가장 먼저 나왔나요? (0) | 2021.12.29 |
댓글