객체: 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)
📌 참고 주소
위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
wikidocs.net
'프로그래밍 - 기본 > Python' 카테고리의 다른 글
[점프 투 파이썬] 3장 - 제어문(if문, while문, for문) (0) | 2021.07.23 |
---|---|
[점프 투 파이썬] 2장 - 연습문제 풀이 (0) | 2021.07.23 |
[점프 투 파이썬] 2장 - 집합 자료형 + 불 자료형 + 변수 (0) | 2021.07.20 |
[점프 투 파이썬] 2장 - 리스트 + 튜플 + 딕셔너리 자료형 (0) | 2021.07.20 |