[Python] Python 공부하기 :
얕은 복사[shallow copy] vs 깊은 복사[deep copy] + 할당[Assignment]
mutable 객체인 리스트를 두개 만들어서 copy를 했음에도
b 리스트의 값을 변경했을 때 a의 값도 같이 변경되는 현상이 발생했습니다.
이런 일이 발생한 이유는
얕은 복사(shallow copy)로 값을 가져왔기 때문입니다.
얕은 복사가 뭐길로 값을 독자적으로 변경시키지 못하는지 이번글에서 알아보겠습니다.
∇ 얕은 복사 [ Shallw Copy ] - 주소값만 복사.
위의 코드에서 a.copy()는 얕은 복사를 수행합니다.
이는 최상위 리스트만 새로 생성하고, 내부 리스트는 원본과 같은 객체를 참조합니다.
[ = 원본 객체의 내용을 새로운 객체로 복사하지만, 내부에 있는 객체들은 동일한 객체로 취급 ]
같은 객체를 참조하고 있는 상태이기 때문에, 하나의 객체를 변경하면 다른 객체에도 영향을 주게 됩니다.
[ = 두 변수 간 독립성이 성립하지 않게 됩니다. ]
copy 모듈의 copy() 메서드를 통해 얕은 복사를 진행 할 수 있습니다.
∇ 깊은 복사 [ Deep Copy ] - 원본 객체의 모든 것을 복사.
: 깊은 복사는 객체의 모든 레벨에서 새로운 복사본을 만듭니다.
- 깊은 복사는 원본 객체의 내용을 새로운 객체로 복사하는 것이지만,
내부에 있는 객체듣도 모두 새로 생성하여 복사합니다.
[ 다른 메모리 공간에 값을 복사해서, 독립성을 유지하는 것 ]
=>> 이런 과정을 거치면서, '원본 객체'-'복사본 객체'는 완전히 독립된 객체가 되며,
한 객체의 변경이 다른 객체에 영향을 미치지 않습니다.
copy 모듈의 deepcoly() 메서드를 통해 깊은 복사를 할 수 있습니다.
++ 깊은 복사(Deep Copy)는 pandas 라이브러리에도 내장되어 있습니다.
pandas 라이브러리에서 데이터프레임을 복사하는데 사용하는 copy()메서드가 있고,
이를 활용해, 데이터프레임을 복사하면
"원본 데이터프레임"과 "복사본 데이터프레임"이 서로 독립적인 객체가 됩니다.
물론, 해당 메서드에서 파라미터 'deep = False' 로 설정하면 얕은 복사가 실행되긴하지만,
원본 데이터프레임에 영향을 주지 않고 복사본을 이용해 자유롭게 데이터 조작 및 분석을 하기 위한
전처리 과정을 원한다면 깊은 복사를 실행할 것 입니다.
++ 얕은 복사와 깊은 복사를 구분해야 하는 이유.
: mutable 객체인 list, dict, set 같은 자료형은 정말 많이 사용하게 되는데
결과값을 출력할 때 원하는 값을 뽑기 위해서는 개념을 잘 구분하고 있어야 합니다.
++주의사항.
: 메모리를 새로 할당하는 깊은 복사는 복사하는 객체의 크기가 크면 계산 시간과 메모리를 많이 사용하게 되므로
주의가 필요합니다.
√할당(Assingment)
: 변수에 값을 대입하는 작업.
할당은 객체를 새로 생성하는 것이 아니라 객체에 대한 참조를 만들어내는 작업입니다.
ex) a=10은 변수 a에 정수 10을 할당하는 것.