티스토리 뷰


* 문자열이나 리스트, 튜플과 같은 변수형은 참조값을 통해 참조할 수가 있다.


얕은 복사(Shallow Copy) : 복합 객체를 별도로 생성하되 내용은 원래의 레퍼런스로 채움. 참조 값만 복사해가서 복사 후 에도 실제 메모리상에서 같은 위치를 가르키는 복사를 말함.


깊은 복사(Deep Copy) : 복합 객체를 생성하고 내용을 재귀적으로 복사함. 쉽게 말해서 새롭게 메모리를 생성함.


1.  Source 부분입니다. 


내장 라이브러리인 copy를 import 하고, copy에 대한 기능을 살펴보겠습니다.




2. Bot1,2,3은 Copy를 통해서 객체 복사에 대해서 알아보기위해 Suspect 클래스에 대한 3개의 객체를 생성했습니다.

객체의 id가 각각 다른 것을 볼 수가 있습니다.




3. Bots에는 Bot1,2,3을 리스트에 저장하였고, Copy_Bots에 Bots 리스트를 복사 하였습니다. 복사를 하니, Bots와 Copy_Bots의 id가 서로 같은 것을 볼 수가 있습니다. 즉, 같은 값을 가르키는 것이라고 볼 수 있습니다.




4.  Copy에는 copy.copy 라이브러리를 사용하여 얕은복사(shallow copy) 기능을 사용하였습니다.



5. DeepCopy에는 copy.deepcopy 라이브러리를 사용하여 깊은복사(deep copy) 기능을 사용하였습니다.



6. 4번과 5번을 진행 후에, 값을 살펴보겠습니다. Copy와 DeepCopy에는 copy(Bots)를 진행한 상태입니다. 한 쪽은 얕은 복사를, 한 쪽은 깊은 복사를 진행 하였습니다. 


Bots[0].weight 에는 이미 60이라는 값을 넣어놨고, 임의로 70으로 바꿔보겠습니다. 얕은 복사를 한 Copy에는 바꾸지 않아도, 이미 Bots에서 값을 변경했기 때문에, 값을 참조하여 그대로 Copy[0].weight도 70으로 변경된 것을 볼 수가 있습니다. 반면에, DeepCopy에는 변경되지 않고 그대로 60이라는 것을 확인할 수가 있습니다. 


* Bots와 Copy는 같은 객체가 가르키는 참조를 공유하지만, Bots와 DeepCopy는 공유하지 않음.



7. id 값을 확인하면 DeepCopy를 진행한 것을 제외하고 Bots와 Copy의 id는 같은 것을 볼 수가 있습니다.

Bots와 Copy는 같은 값을 가지지만, 두 번째 줄을 볼 때 id(Bots)와 id(Copy)의 결과는 다른 것을 볼 수가 있는데, 이 것의 이유는 Bots과 Copy는 서로 가르키는 객체가 포함하는 모든 참조들을 복사하지만 내장된 객체 자체는 복사하지 않기 때문입니다.



is 연산자로 확인을 해보면 값은 True이지만 객체 자체는 다른 것을 확인할 수가 있습니다.




의견 : 임우석


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함