🌟 Deep copy and Shallow copy
안녕하세요,
알고리즘 스터디 코드리뷰 중, 변수의 copy 관련해서 석진 준호님과 나눈 내용을 정리할겸,
정리한 내용을 멋사 여러분과 함께 공유하면 좋지 않을까 하여 글을 작성하게 되었습니다.
다음은 제가 알고있는 Programming Language에서 Copy에 관한 지식입니다.
(혹시 잘못된 부분이 있다면 피드백 부탁드려요~ 😆)
Deep copy (깊은 복사)
저희가 일반적으로 생각하는 변수의 복사입니다.
예를 들어, a라는 변수가 100이라는 정수형 값일 때, b = a와 같이 b에 a의 값을 복사하면,
이후 a와 b는 완전히 독립적인 변수가 되어, 서로의 연산 결과에 영향을 받지 않습니다.
이를 코드로 작성하면 다음과 같습니다.
// Written by Javascript
let a = 100;
let b = a;
b += 100;
console.log(a) // 100
console.log(b) // 200
Shallow copy (얕은 복사)
값을 복사하지만 새로운 변수에 대해 새로운 메모리를 할당하지 않습니다.
즉, 두 변수는 같은 Memory space를 공유하며, 변수의 값을 수졍하면 서로에게 영향을 미칩니다.
이를 코드로 작성하면 다음과 같습니다.
// Written by Javascript
let a = [1, 2, 3, 4, 5]
let b = a;
for(let i = 0; i < 5; i++){
b[i] += 100; // b 배열의 모든 원소에 100을 더합니다.
}
console.log(a); // [101, 102, 103, 104, 105]
console.log(b); // [101, 102, 103, 104, 105]
- Data type / Language별 Copy 방식
위의 표에서 언급된 모든 언어에서, list type에 대해서는 Shallow copy가 발생합니다.
즉, 다음과 같이 작성된 python 코드에서 배열의 복사는 Shallow copy 방식으로 동작합니다.
# Written by Python
a = [1, 2, 3, 4, 5]
b = a
b[0] = 10
print(a) # [10, 2, 3, 4, 5]
print(b) # [10, 2, 3, 4, 5]
List type 변수에 대해 Deep copy를 적용하고 싶다면 다음과 같이 처리할 수 있습니다.
from copy import deepcopy
a = [1, 2, 3, 4, 5]
b = a[:] # 방법 1
c = list(a) # 방법 2
d = a.copy() # 방법 3
e = deepcopy(a) # 방법 4
글 마무리를 어떻게 해야할지 모르겠네요!
Deep & Shallow copy에 대해 한번쯤은 들어보셨을텐데,
내용이 헷갈리셨던 분들에게 아무쪼록 도움이 되셨다면 좋겠습니다☺️
감사합니다.
- 질문
혹시 직전 코드에서 방법 3과 4가 모두 Deep copy가 맞는거 같은데, 둘의 유의미한 차이가 있을까요?