파이썬에서 리스트와 같이 mutable한 객체를 복사할 때에는 주의해야 한다.
immutable (변하지 않는) : int, float, tuple, str, bool
mutable (변하는) : list, set, dictionary
파이썬에서 mutable한 객체를 아래와 같이 복사하면
두 객체가 같은 주소값을 참조하게 되는 얕은 복사가 이루어져
복사된 객체의 값을 변경하면 기존 객체도 같이 변경된다.
copyList = list # 얕은 복사
그렇다면 기존 객체를 보존하고자 할 때 사용하는 복사 방법을 알아보자.
copyList = list[:] # 얕은 복사 - 슬라이싱
copyList = list.copy() # 얕은 복사 - 메소드
import copy
copyList = copy.copy(list) # 얕은 복사 - 모듈
위 세 가지 방법으로 객체를 복사하면
객체 자체는 깊은 복사가 이루어져 기존 객체를 보존하는 듯 하지만,
객체 내부의 요소들까지는 깊은 복사가 이루어지지 않는다.
따라서 일차원 객체는 깊은 복사가 가능하지만, 다차원 객체의 깊은 복사는 불가능하다.
import copy
copyList = copy.deepcopy(list) # 깊은 복사
copy 모듈의 deepcopy 메소드를 사용하면 객체 내부 요소들까지 깊은 복사가 가능하다.
단, deepcopy 메소드는 시간이 많이 걸려서 꼭 필요한 다차원 객체의 복사에만 사용하는 것이 좋겠다.