깊은 복사와 얕은 복사

김건우·2021년 12월 7일
0

파이썬

목록 보기
3/18
post-thumbnail

두 객체의 비교와 복사

객체 비교
V1 == V2 : 변수 V1과 V2가 참조하는 객체의 내용이 같은가? (내용비교)
V1 is V2 : 변수 V1과 V2가 참조하는 객체는 동일 객체 인가? (동등비교)

r1 = [1, 2, 3]
r2= [1, 2, 3]
r1 is r2		# r1과 r2가 참조하는 객체는 같은 객체인가?
> False
r1 == r2 		# r1과 r2가 참조하는 객체에 담긴 값은 같은가?
> True

is 연산이 True를 반환하는 상황은 다음과 같다.

r1 = [1, 2, 3]
r2 = r1
r1 is r2
> True

객체 복사

[얕은 복사]

  • 참조만 하기 때문에, 속도나 메모리측면에서 효율적이다.
r1 = ['John', ('man', 'USA'), [175, 23]]
r2 = list(r1)
r1 is r2
> False
r1[0] is r2[0]		# r1과 r2의 'John'은 동일 객체인가?
> True
r1[1] is r1[1]		# r1과 r2의 ('man','USA')는 동일 객체인가?
> True
r1[2] is r2[2]		# r1과 r2의 [175, 23]은 동일 객체인가?
> True

R1 리스트 안의 문자열, 튜플, 리스트 객체는 R1이 참조하는 리스트객체 안에 있는 것이 아닌,
리스트객체안에서 각각 문자열, 튜플, 리스트 객체를 참조하는 것이다.

R2 리스트 객체와 R1 리스트 객체는 다른 객체이나, 리스트들 안에 있는 문자열, 튜플, 리스트 객체는 동일 객체이다.
= 복사시에 R1 리스트 객체안의 참조되어 있는 문자열, 튜플, 리스트 객체를 복사하기때문에

이러한 형태의 복사를 가리켜 '얕은 복사' 라고 한다.
= ‘얕은 복사’가 파이썬이 복사를 진행하는 기본방식.
= immutable 객체는 복사시에 참조만 공유해도 문제가 되지 않으나, mutable 객체는 문제가 될 수 있다.

[깊은 복사]

  • 리스트를 참조하고 있는 객체까지 포함하여 복사하는 것.
J2021 = ['John', ('man', 'USA'), [175, 23]]
J2022 = list(J2021)
J2022[2][1] += 1
J2021
> ['John', ('man', 'USA'), [175, 24]]
J2022
> ['John', ('man', 'USA'), [175, 24]]

깊고 얕은 복사
immutable한 객체는 참조(얕은복사)를 하고, mutable한 객체에 대해서만 복사(깊은복사)를 진행한다.

Copy 모듈의 deepcopy 함수를 사용한 복사

J2021 = ['John', ('man', 'USA'), [175, 23]]
import copy
J2022 = copy.deepcopy(J2021)
J2022[2][1] += 1
J2021
> ['John', ('man', 'USA'), [175, 23]]
J2022
> ['John', ('man', 'USA'), [175, 24]]
(J2021[0] is J2022[0]) and (J2021[1] is J2022[1])	# 얕은 복사 확인
> True
J2021[2] is J2022[2]
> False

deepcopy 함수 사용시, immutable 객체를 대상으로는 얕은복사가 진행되고, mutable 객체 대상으로는 깊은복사가 진행이 된다.

immutable 객체인 튜플이나, 문자열 복사 시 얕은 복사가 진행.

d1 = (1, 2, 3)
d2 = 'Please'
c1 = tuple(d1)		# d1 기반으로 튜플 생성, 사실상 튜플 복사
c2 = str(d2)		# d2 기반으로 문자열 생성, 사실상 문자열 복사
d1 is c1		# d1과 c1이 참조하는 대상이 같은 객체인가?
> True
d2 is c2		# d2와 c2가 참조하는 대상이 같은 객체인가?
> True
profile
공부하는 개발자가 목표입니다.

0개의 댓글