파이썬 코드를 구현하고, 머신러닝을 공부하면서 알게된 개념인 "할당, 얕은 복사, 깊은 복사" 에 대한 글을 쓸려고 합니다. 이미 알고 있는 사람들도 많이 있을 것 같지만 각각의 차이를 확실하게 알고 넘어가고자 글을 쓰게 되었습니다.
: 할당은 변수에 값을 대입하는 작업을 말합니다. 예를 들어, a = 10
은 변수 a에 정수 10을 할당하는 것을 의미합니다. 이 경우, a는 10 이라는 값을 가진 정수 객체를 참조하게 됩니다. 할당은 객체를 새로 생성하는 것이 아니라 객체에 대한 참조를 만들어내는 작업입니다.
: 얕은 복사는 원본 객체의 내용을 새로운 객체로 복사하는 것을 말합니다. 그러나 내부에 있는 객체들은 동일한 객체를 참조합니다.
이 말은 "얕은 복사를 한 경우 원본 객체와 복사본 객체는 동일한 객체를 참조"하게 됩니다. 따라서 하나의 객체를 변경하면 다른 객체에도 영향을 줄 수 있습니다.
파이썬에서는 copy 모듈
의 copy()
메서드를 통해 얕은 복사를 볼 수 있습니다.
예를 들어, 다음과 같은 리스트를 얕은 복사하는 경우:
import copy
a = [1, 2, [3, 4]]
b = copy.copy(a)
# 원본 리스트 출력
print(a) # 출력: [1, 2, [3, 4]]
# 얕은 복사 리스트 출력
print(b) # 출력: [1, 2, [3, 4]]
# 내부 리스트 변경
b[2][0] = 99
# 변경 후 리스트 출력
print(a) # 출력: [1, 2, [99, 4]]
print(b) # 출력: [1, 2, [99, 4]]
위의 예시에서, b 리스트
는 copy(a)
를 통해 a 리스트
를 얕은 복사하였습니다. a와 b 리스트는 서로 다른 리스트 객체이지만, 내부의 "[3, 4] 리스트" 는 동일한 객체를 참조 하게 됩니다.
따라서, 예시와 같이 b 리스트
에서 내부 리스트([3,4])의 요소를 변경하면 a 리스트
에도 영향을 주는 것을 확인할 수 있습니다.
이렇게 copy 모듈
의 copy()
메서드를 사용하여 객체를 얕은 복사할 수 있으며, 이를 통해 객체의 얕은 복사를 수행할 수 있습니다.
: 깊은 복사는 원본 객체의 내용을 새로운 객체로 복사하는 것이지만, 내부에 있는 객체들도 모두 새로 생성하여 복사합니다. 이렇게 하면 원본 객체와 복사본 객체는 완전히 독립된 객체가 되며, 한 객체의 변경이 다른 객체에 영향을 미치지 않습니다.
파이썬에서는 copy 모듈
의 deepcopy()
메서드를 통해 깊은 복사를 볼 수 있습니다.
import copy
import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a)
# 원본 리스트 출력
print(a) # 출력: [1, 2, [3, 4]]
# 얕은 복사 리스트 출력
print(b) # 출력: [1, 2, [3, 4]]
# 내부 리스트 변경
b[2][0] = 99
# 변경 후 리스트 출력
print(a) # 출력: [1, 2, [3, 4]]
print(b) # 출력: [1, 2, [99, 4]]
얕은 복사에서 사용한 예시와 똑같은 예시를 들자면, 둘의 차이는 copy() -> deepcopy()
로 사용한 메서드의 변경만 있었습니다. 그러나 결과는 a 리스트
와 b 리스트
가 서로에게 영향을 주지 않고 있음을 확인할 수 있었습니다.
더 나아가, ✅ 깊은 복사는 pandas
라이브러리에도 내장되어있습니다.
pandas
라이브러리에서 데이터프레임을 복사하는 데 사용되는 copy()
메서드가 있고, 이를 사용하여 데이터프레임을 복사하면 원본 데이터프레임과 복사본 데이터프레임이 서로 독립적인 객체가 됩니다.
물론, 해당 메서드에서 파라미터 deep = False
로 설정하면 얕은 복사가 실행되긴하지만, 원본 데이터프레임에 영향을 주지 않고 복사본을 이용해 자유롭게 데이터 조작 및 분석을 하기 위한 전처리 과정을 원한다면 깊은 복사를 실행할 것 입니다.
이렇게 할당, 얕은 복사, 깊은 복사 - 각각의 개념에 대해 알 수 있었습니다.
정말 좋은 정보 감사합니다!