2022-07-07
사실 파이썬에서는 특정하게 우리가 자료를 명시하지 않기에 정확하게 자료형에 대한 파악이 모호할 때가 있다.그래두 자체적으로 저장되는 타입들이 있으니 먼저 정리를 해둘려고한다.
간단하게 생각해보자
변경이 가능한 객체=mutable 객체(list,set,dictionary)
변경이 가능 안되는 객체=immutable 객체(int,float,tuple,str,bool 등등)
복잡한거 다 떼고 정리를 하자면
mutable한 자료형은 각각 메모리를 생성해서 아무리 값이 같아도 다 다를 메모리를 참고한다
immutable한 자료형은 값이 같으면 거의 대부분 같은 메모리를 참고함
따라서 복사얘기로 다시 돌아오자면
immutable한 객체를 먼저 상황을 대보자면
a=3
b=a
a=2
이와 같이 한다면 처음에는 b는 a를 참조하게 되는데 이 때 a값의 새로운 값을 할당하면 a는 2라는 메모리를 새롭게 참조하기에 a와 b는 엄연히 다른 값을 참조하게 된다
하지만
mutable한 객체인 리스트나 딕셔너리 set 같은 것에서 상황을 보면 달라진다
arr1=[1,2,3]
arr2=arr1
arr1.append(4)
이와 같이 될경우 arr2는 arr1을 참조하게 되는데 이 때 arr1의 값이 바뀌면 자동적으로 arr2가 가리키는게 arr1이기에 arr2 또한 arr1이된다
따라서 깊은복사,얕은복사 문제는 mutable한 타입에서의 문제이지 immutable은 의미가 없다
따라서 몇가지 방법이 존재한다
arr1=[1,2,3]
arr2=arr1[:]
이와 같이 하면 arr1과 arr2는 다른 메모리를 참조하게 된다.하지만 만약에 arr1에 내부에 리스트가 또 존재할시 체크해보면 그 안에 있는 리스트는 arr1과arr2 둘다 같은 주소를 참조하게 된다....
즉 이런면에서 약간 모호한 깊은복사(?),얕은복사(?)로 쓸수 있다.
import copy
arr1=[1,2,3]
arr2=copy.copy(arr1)
사실 이것또한 같은 얕은복사이다

출처:https://blockdmask.tistory.com/576
import copy
arr1=[1,2,3]
arr2=copy.deepcopy(arr1)
아예 새롭게 전체 새로운 메모리를 생성해준다

출처:https://blockdmask.tistory.com/576
그냥 복사해서 쓰고
특히 이중리스트를 안 가질 것 같으면 [:]슬라이싱으로 가볍게 써주는 게 좋을 듯 하다