혹시 이 글을 읽는 독자는 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 등)이나 객체에도 해당되는 이야기이니, 유용하게 사용하기를 바란다.
'Python > Python 모듈탐구' 카테고리의 다른 글
[Python] - 모듈탐구 os - Python으로 내 컴퓨터 조작하기 (0) | 2021.04.11 |
---|---|
[Python] - 모듈탐구 pickle - 자료구조의 저장과 불러오기 (0) | 2021.04.11 |
[Python] - 모듈탐구 base64 - == = (0) | 2021.04.11 |
[Python] - 모듈탐구 random - Python을 처음하신다구요? 그런당신을 위해 준비했습니다! (0) | 2021.04.11 |
[Python] - 모듈탐구 time - Python 멈춰! (0) | 2021.04.11 |