Python/Python 모듈탐구

[Python] - 모듈탐구 copy - 뭐! 모듈이 복사가 된다고?

혹시 이 글을 읽는 독자는 LIST의 복사를 시도해보았는가? 아마 a=[1,2,3]과 같은 LIST를 바로 b=a로 복사부터 시도했을 가능성이 크다(우리 Python은 직관적이어서 이거도 돼야 되는 거 아닌가?) 웃긴 건 이때 a [0]=5를 하면 b도 [5,2,3]이 된다는 점이다. 이는 복사의 깊이가 달라서 생기는 문제이다.

 


복사의 구분

복사는 수준에 따라 다음과 같이 구분된다.

① 얕은 복사(Shallow copy) : 메모리 주소만 같은 곳을 가리키게 복사되는것, 값이 복사되는 것은 아니다.
② 깊은 복사(Deep copy) : 실제 값까지 모두 복사되는 것

 

Python은 모듈 copy를 통해서 이 복사행위를 다룬다. 다음은 두 가지는 copy모듈이 제공하는 함수이다.

1. copy.copy(x) : x의 얕은 복사결과를 반환

2. copy.deepcopy(x) : x의 깊은 복사결과를 반환

 

다음은 예시이다.

>>> import copy
>>> a=[[1,2,3,4,5],[6,7,8,9]]
>>> b = copy.copy(a)
>>> a[1].append(10)
>>> print(b)
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
>>> b = copy.deepcopy(a)
>>> a[1].append(11)
>>> print(b)
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]

다음과 같이 얕은복사로 이루어진 copy.copy는 원본의 추가 연산이 복사본에도 영향이 가고, 깊은 복사가 실행된 이후에는 원본의 변화가 복사본에 영향을 미치지 않는 것을 확인할 수 있다.


이번 모듈탐구 시간에는 복사를 용이하게 도와주는 copy모듈에 대해서 알아보았다. 비록 list를 예시로 들었지만, 다른 자료구조(Dict, tuple 등)이나 객체에도 해당되는 이야기이니, 유용하게 사용하기를 바란다.