자료실/파이썬(Python)

파이썬(Python) - 얕은 복사, 깊은복사

자료수집중 2020. 7. 27.
반응형

 

파이썬에서는 변수가 곧 객체라고 말할 수 있습니다.

객체가 속성과 동작들을 하나로 묶은 데이터라고 했었습니다.

파이썬의 모든 것은 객체입니다. 

print(type(1))
>><class 'int'>

a = 1
print(type(a))
>><class 'int'>

a = 10은  a라는 변수에 정수형 객체 10의 주소를 가리킨다는 의미기도 합니다. (a는 객체 10을 가리킨다) 

 

 

이제 객체를 두가지 성격으로 나눌 수 있습니다.

바로 mutableimmutable입니다.

mutable은 '변하기 쉬운'이라는 뜻이고 immutable은 반대로 '불변의'라는 뜻입니다.

mutable는 변경이 가능한 객체이고 immutable는 변경이 불가능한 객체 입니다.
변경이 가능한 객체(mutable)는 리스트(list), 딕셔너리(dict), 집합(set)이 있습니다.변경이 불가능한 객체(immutable)는 정수, 실수, 문자열, bool, 튜플(tuple)이 있습니다.

 

 

가장 큰 차이점을 살펴보면 변수와 변수와 의 대입입니다.예제로 살펴보겠습니다.

#mutable
a = ["red", "blue", "green", "pink", "black"]
b = a
b[3] = "white"
print(a)

#immutable
c = 'hello'
d = c
d = 'world'
print(c)

 

변수a는 리스트를 대입했습니다. 리스트는 mutable입니다.변수b에 변수a를 대입한 다음 b를 수정했습니다. 결과를 보면 a까지 같이 수정이 되는 모습을 보여줍니다. 반대도 마찬가지입니다.

 

변수c에는 문자열을 대입했습니다. 문자열은 immutable입니다. 변수d에 변수c를 대입 후 변수d를 수정해도 변수c의 값은 변하지 않습니다.이 문제를 해결하기 위한 얕은 복사, 깊은 복사에 대해 알아보겠습니다.

 

 

얕은 복사(shallow copy)와 깊은 복사(deep copy)를 사용하기 위해서 새로운 모듈을 사용하겠습니다.

바로 copy입니다.

import copy

 

 

먼저 얕은 복사(shallow copy)입니다.

얕은 복사를 이용하여 예제를 작성해보겠습니다.

import copy

a = ["red", "blue", "green", "pink", "black"]
b = copy.copy(a) #얕은 복사
b[2] = 'white'
print('a = ', a)
print('b = ', b)

 

변수a를 얕은 복사(copy.copy(a))를 이용해서 변수b에 복사했습니다.

변수b의 요소를 변경해도 변수a는 변경이 발생하지 않는 모습을 보여줍니다.

하지만 얕은 복사에는 약점이 있습니다.

 

이번에는 리스트 요소로 리스트를 포함시킨 변수를 옅은 복사를 해보겠습니다.

import copy

a = ["red", "blue", ["green", "pink", "black"]]
b = copy.copy(a) #얕은 복사
b[2][1] = 'white'
print('a = ', a)
print('b = ', b)

 

복사한 변수b를 수정하니 a까지도 결국 수정이 된 출력을 볼 수 있습니다.

내부 객체까지는 복사해 오지 않고 공유하는 결과가 나옵니다.

 

 

다음은 깊은 복사(deep copy) 입니다.

깊은 복사는 얕은 복사의 약점인 내부 객체까지도 복사해서 새롭게 대입합니다.

위의 얕은 복사 예제를 깊은 복사로 수정해보겠습니다.

import copy

a = ["red", "blue", ["green", "pink", "black"]]
b = copy.deepcopy(a) #깊은 복사
b[2][1] = 'white'
print('a = ', a)
print('b = ', b)

 

깊은 복사 후 수정을 하면 각각 따로 결과가 다르게 출력되는 모습을 볼 수 있습니다.

댓글