[Python] Shallow copy와 Deep copy의 차이점이 뭐에요?

da__ell·2023년 2월 24일
0

python

목록 보기
6/6
post-thumbnail

파이썬에서 assignment opeartion(=)은 객체의 복사본을 만들지 않습니다. 메모리 상에 존재하는 하나의 객체에 대해 다른 변수를 바인딩하는 것에 불과합니다.
따라서 리스트와 같은 변경 가능한 객체에 대해서 b=a를 수행하고 a의 원소값을 변경하면 b의 값 또한 마찬가지로 변경됩니다.

a = [1,3,5,7]
b = a
a[3] = 96
# a >> 
[1, 3, 5, 96]
# b >>
[1, 3, 5, 96]

하지만 문자열, 정수와 같은 불변(immutable) 객체에는 적용되지 않죠.

a = 10
b = a
>>> b
10

a = 5
>>> b
10

객체를 복사할 때, deep copy와 shallow copy는 각기 다른 방법으로 객체를 복제합니다.
deep copy는 완전히 새로운 객체를 만들고, 해당 객체의 새로운 인스턴스 변수를 만들어서 복사합니다.
shallow copy는 객체의 참조만 복사합니다다.

Shallow copy

원래 객체의 인스턴스 변수를 참조하기 때문에, 원본 객체의 변경 사항이 복사본에 영향을 미칩니다.

# shallow copy of a list
lst1 = [1, 2, [3, 4]]
lst2 = lst1.copy()

# changing the nested list of lst2 also changes lst1
lst2[2][0] = 5

print(lst1)  # [1, 2, [5, 4]]
print(lst2)  # [1, 2, [5, 4]]

위 예시에서 lst1은 원래 리스트이고 lst2는 lst1를 복사한 것이다. 하지만 lst2[2][0]을 변경했더니 lst1도 같이 변경됩니다. 이는 리스트가 완전히 복사되는 것이 아니라 참조하는 것이기 때문입니다.

Deep copy

완전히 새로운 객체를 만들기 때문에, 원본 객체의 변경사항이 복사본에 영향을 미치지 않습니다.

# deep copy of a list
import copy

lst3 = [1, 2, [3, 4]]
lst4 = copy.deepcopy(lst3)

# changing the nested list of lst4 does not change lst3
lst4[2][0] = 5

print(lst3)  # [1, 2, [3, 4]]
print(lst4)  # [1, 2, [5, 4]]

deep copy를 사용하면 완전히 새로운 객체가 만들어지기 때문에 lst4를 변경해도 lst3에 영향을 미치지 않습니다.

profile
daelkdev@gmail.com

0개의 댓글