데이터 및 C언어/Python 공부 내용

[Python] Python 공부하기 : 얕은 복사[shallow copy] vs 깊은 복사[deep copy]

  • -
반응형

 

 

[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을 할당하는 것.

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.