IT/Python

[Python] 얕은복사, 깊은복사

김반장님 2021. 3. 31. 13:58
반응형

1.1 얕은 복사와 깊은 복사  

파이썬의 모든 변수는 해당 객체의 주소를 가지고 있다. a = 1 이라고 한다면 a라는 변수에 1이라는 값이 들어가는 것이 아니라, 1 이라는 객체를 생성한 후, a 는 1이란 객체의 주소를 저장하게 되는 것이다. (실제로도 1은 일반적으로 객체가 생성되어 있으며, 선언 시점에 객체가 생성되는 것은 아니라고 한다.) 일단 다음 그림을 보자. 

 

[ 그림 1-1 ]

 

[ 그림 1-1 ]을 보면 알겠지만 변수 a 에 리스트 객체가 생성되고 두 번째 라인에서 b에 a 객체가 복사되는 것으로 생각할 수 있지만,  사실은 a 가 가르키고 있는 [1, 2, 3] 의 주소를 b 에 동일한 주소가 복사되는 것이다. (중요)  따라서 a 와 b는 동일한 리스트 객체를  공유하게 되는 것이다. 다음 그림을 보자. 

 

[ 그림 1-2 ]

 

[ 그림 1-2 ] 와 같이 변수는 객체의 주소를 참조하고 있기 때문에 a의 첫번째 값인 1을 4로 변경하더라도 변수 b도 동일한 값을 표시하게 되는 것이다. 아래 [ 그림 1-3 ] 을 보면 더욱 확실하게 알 수 있다. 

  

[ 그림 1-3 ]

 

객체의 고유한 값인 아이디를 반환하는 함수인 id()로 확인해 보면 똑같은 값을 갖는 것을 알 수 있다. 

만약 다른 a 와 b 가 같은 객체를 공유하지 않게 하기 위해선 아래와 같이 하면 된다. 

 

[ 그림 1-4 ]

 

리스트는 [ 그림 1-4 ] 와 같이 하고 리스트 이외의 경우는 copy() 함수를 사용한다. 여기서 말하는 copy() 함수는 주소가 복사되어 객체를 공유하는 얕은 복사(shallow copy)를 하는 함수이며, deepcopy() 함수는 객체를 공유하지 않는 깊은 복사(deep copy)를 한다. 

아래 그림을 살펴보도록 하자. 

 

[ 그림 1-5 ]

 

이렇다~ 그림만 보면 알듯해서 설명은 생략.

copy() 와 deepcopy()에 대해서 좀 더 설명을 하면 copy.copy() 객체는 생성할 때 객체를 그대로 사용(치환) 하는 것이고,  copy.deepcopy()는 생성 시에 객체를 복사하는 것이다. 여기까지는 책에 나와있는 대로 설명이고 모르겠으니 그냥 보자.

 

[ 그림 1-6 ]

 

[ 그림 1-7 ]

 

a와 cp_a 의 생성시에는 치환으로 동일한 객체를 나타내지만, dcp_a 는 새로 객체를 복사하기 때문에 id가 다른 것을 확인할 수 있다. 

반응형

'IT > Python' 카테고리의 다른 글

[Python] 부울 / 논리연산자  (0) 2021.03.30
[Python] 사전  (0) 2021.03.29
[Python] 튜플  (0) 2021.03.28
[Python] 세트  (0) 2021.03.27
[Python] 리스트  (0) 2021.03.26