본문 바로가기

프로그래밍 - 기본/Python

[변수] 얕은 복사와 깊은 복사

객체: mutable/immutable

class 구분
list(리스트) mutable
dict(딕셔너리) mutable
set(집합) mutable
tuple(튜플) immutable
bool(불) immutable
int(정수형) immutable
float(실수형) immutable
str(문자열) immutable
frozenset(집합) immutable

 

주소 변경의 유무

- 값 변경시 > 주소 변경 X

a=[1,2,3] 👉🏻 id(a)=4000
a[0]=4 👉🏻 id(a)=4000

- 값 재할당 시 > 주소 변경 O

a="abc" 👉🏻 id(a)=4000
a="efg" 👉🏻 id(a)=9999

위의 것은 mutable/immutable 변수간 대입에서도 동일하게 작용한다

 

얕은 복사(shallow copy)

완전히 모든 내부 객체들이 새롭게 copy되는 방식

방법

1. [:] 이용하기(리스트 슬라이싱)

🚨 내부 객체의 주소는 여전히 동일

#선언
a=[[1,2], [3,4]]
b=a[:]

#주소: 서로 동일하지 않음
id(a) 👉🏻4000
id(b) 👉🏻5000

#내부 객체 주소: 서로 동일함 > 문제!
id(a[0]) 👉🏻6000
id(b[0]) 👉🏻6000

2. 재할당

🚨 내부 객체의 주소는 달라지지만, 다른 내부 객체 주소는 여전히 동일

#선언
a=[[1,2], [3,4]]
b=a[:]

#재할당
a[0]=[8,9] #a=[[8,9], [3,4]]

#재할당된 곳의 내부 객체 주소
id(a[0]) 👉🏻7000
id(b[0]) 👉🏻6000

#나머지 내부 객체 주소
id(a[1]) 👉🏻8000
id(b[1]) 👉🏻8000

3. copy 모듈의 copy 메소드 활용

🚨 내부 객체의 주소는 여전히 동일

import copy
a=[[1,2], [3,4]]
b=copy.copy(a)

#값 할당
a[1].append(5)
a 👉🏻[[1,2], [3,4,5]]
b 👉🏻[[1,2], [3,4,5]]

#내부 객체의 주소
id(a[1]) 👉🏻8000
id(b[1]) 👉🏻8000

 

깊은 복사(deep copy)

완전히 모든 내부 객체들까지 새롭게 copy되는 방식

방법

copy 모듈의 deepcopy 메소드 활용
import copy
a=[[1,2], [3,4]]
b=copy.deepcopy(a)

 

📌 참고 주소

https://wikidocs.net/16038

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net