자료구조,알고리즘(Python)/알고리즘(Python)

Deep copy, Shallow copy

드롱드롱 2024. 9. 1. 12:50

그래프 알고리즘을 공부하던 도중 블로그 설명 중간에 있던 deep copy와 shallow copy의 보다 명확한 이해를 위해 글을 작성한다.

 

copy에 대해 이해하기 전에 그보다 더 기본 배경이 되는 mutable과 immutable에 대해 이해한 후 copy를 이해해보자.

 

 

1. mutable과 immutable 객체

일단 파이썬은 객체 지향형 프로그래밍이니 뭐니 객체에 대해 너무 많이 이야기를 들었는데 이 공부를 하기 전까지 객체에 대해 너무 두루뭉실하게 알고 있었다.

객체란 3가지 요소로 구성된다. 주소(id), 데이터형(type), 값(value)

 

mutable은 값이 변할 수 있는, immutable은 반대로 값이 변할 수 없다는 의미를 가지고 있다.

mutable에는 list,dict,set이 있고, immutable 변수에는 정수(int), 문자열(str)과 tuple 등이 있다.

 

immutable은 객체 특성상 값이 동일하면 같은 주소값을 가진다.(통상적으로 그렇고 100% 값이 동일하다고 같은 주소값을 가지는 것은 아니다 (값이 커지거나 복잡해지면 같은 값을 같더라도 다른 값으로 인식하여 새로운 객체를 생성할 필요는 없다.)

 

https://kevinitcoding.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%ACPython-immutable%EA%B3%BC-mutable-%EA%B0%9D%EC%B2%B4

 

[파이썬/Python] immutable과 mutable 객체

immutable과 mutable 객체, 왜 알아야 하나요? 코딩을 공부하시다 보면, 깊은 복사와 얕은 복사에 대한 개념을 종종 접할 때가 있습니다. 이 개념에 대해 모르고 사용하시는 분들도 많으신데요. 평소

kevinitcoding.tistory.com

 

 

2. Deep copy와 Shallow copy

 

얕은 복사와 깊은 복사는 mutable 객체를 복사할 때만 신경써주면 된다!

 

앝은 복사(Shallow copy)

 

얕은 복사는 객체의 참조값, 즉 주소값만 복사하는 것을 의미한다. 객체의 주소값을 복사하기 때문에 복사 대상의 값이 바뀌면 복사한 값도 바뀌게 된다. 즉, 두 변수간 독립성이 성립하지 않는다!

 

파이썬은 기본적으로 객체 지향 언어라서 얕은 복사를 지향한다.

 

immutable한 객체는 복사한 이후에 원본을 변경해도 변화가 없지만 mutable한 객체는 복사한 이후에 원본을 변경하면 똑같이 변경된다.

 

import copy

ori = [1,2]
a = [ori, 3]
b = copy.copy(a)
b[0][1]=0
a[1] = 2
print(a)
# [[1,0],2]    >mutable 객체를 변경하면 원본도 변경된다.
print(b)
# [[1,0],3]    >immutable 객체를 변경하는 것은 독립성이 유지된다.

 

 

깊은 복사(Deep copy)

 

깊은 복사는 다른 메모리 공간에 값을 복사함으로써, mutable 객체의 독립성을 유지해주는 역할을 한다. 

import copy

ori = [1,2]
a = [ori, 3]
c = copy.deepcopy(a)
a[1] = 2
c[0][1]=3
print(a) # [[1,2],2]
print(c) # [[1,3],3]
#deepcopy는 list a와 c 간의 독립성을 유지하게 한다!

 

 

 

 

3. Deep copy와 Shallow copy를 이해해야 하는 이유

 

코딩을 하다 보면, 원본 값을 바꾸더라도 복사한 객체의 값이 바뀌지 않아야 하는 경우가 꽤 있다. (mutable 객체인 list, dict, set은 정말 많이 활용되기 때문!)

 

얕은 복사를 하든, 깊은 복사를 하든 에러값은 나오지 않기 때문에 copy에 대한 제대로 된 이해가 없으면 디버깅을 하는데 애를 엄청 먹을 수 있다.

 

결론, 파이썬은 재밌따.

 

 

 

 

Reference

https://kevinitcoding.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%ACPython-%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%ACShallow-copy%EC%99%80-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%ACdeep-copy%EC%97%90-%EB%8C%80%ED%95%9C-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC

 

[파이썬/Python] 얕은 복사(Shallow copy)와 깊은 복사(deep copy)에 대한 완벽 정리

얕은 복사와 깊은 복사에 대한 정의 mutable 객체, 그것이 문제로다. 파이썬에서는 immutable 객체와 mutable 객체가 있습니다. immutable 객체는 값을 바꿀 수 없는 객체입니다. 값이 바뀌면 다른 메모리

kevinitcoding.tistory.com