*** BOJ 17488을 풀면서 리스트에 대한 변수 할당에 대해 의문을 가지면서 Deep Copy에 대해 공부해봤다.
Immutable(불변) vs Mutable(만변)
파이썬에서의 변수 개념은 저장공간을 할당 받지 않고 객체를 가리키는 포인터 개념이다
C언어에서는 int a = 1을 하면 a변수는 1의 값을 가지며 변수 a와 1은 같은 존재이다.
하지만 파이썬에서 a = 1은 a와 1은 별개의 존재이다.
a라는 변수는 Integer 1이라는 객체를 가리키고 있을뿐 변수에 정수 1의 값이 할당 된 것이 아니다.
Immutable : 숫자형(Number), 문자형(String), 튜플(Tuple)
a = 1
b = a
print(a, b) # 1 1
b = 2
print(a, b) # 1 2
Mutable : 리스트(list), 딕셔너리(Dictionary), 집합(set)
a = [1, 2, 3, 4]
b = a
print(a, b) # [1, 2, 3, 4] [1, 2, 3, 4]
b[1] = 0 # 배열 b의 두번째 값을 0으로 바꿔준다.
print(a, b) # [1, 0, 3, 4] [1, 0, 3, 4]
위에서 a와 b는 같은 주소값을 참조한다. list는 mutable하기 때문에 b의 값을 바뀌어 버리면 그 주소값에 있는 값을 바꾸어 버리기 때문에 같은 주소값을 참조하던 a도 값이 바뀌게 나온다.
Shallow Copy vs Deep Copy
Shallow Copy : 객체를 새로운 객체로 복사하지만 원본 객체의 주소값을 복사
Deep Copy : 전체 복사로 참조값의 복사가 아닌 참조된 객체 자체를 복사
Deep Copy를 위한 여러가지 방법
#copy모듈의 deepcopy() 이용
import copy
a = [1, 2, 3, 4]
b = copy.deepcopy(a)
b[1] = 0
print(a, b) # [1, 2, 3, 4] [1, 0, 3, 4]
#클래스가 가지고있는 copy()이용
#기본적인 클래스들이 가지고있는 copy()이용
#list 클래스 역시 copy() 가지고 있음
a = [1, 2, 3, 4]
b = a.copy()
b[1] = 0
print(a,b) # [1, 2, 3, 4] [1, 0, 3, 4]
#리스트 슬라이싱
a = [1, 2, 3, 4]
b = a[:]
b[1] = 0
print(a,b) # [1, 2, 3, 4] [1, 0, 3, 4]
각 방법 별로 처리속도가 다르니 이는 참고하는게 좋다.
처리속도는 리스트 슬라이싱이 가장 빠르고 copy 모듈의 deepcopy() 메소드가 가장 느리다고 한다.
리스트 슬라이싱이나 제네릭 copy의 copy() 메소드는 리스트가 오브젝트를 포함할 경우 그 오브젝트들은 얕은복사되는 것만 주의해서 사용하면 된다.
https://crackerjacks.tistory.com/14
'Algorithm > concept' 카테고리의 다른 글
코딩 테스트를 위한 기술 정리 (0) | 2022.05.13 |
---|---|
Coding Test(Priority Queue, Heap) (0) | 2022.04.30 |
Coding Test(최단 경로 알고리즘) (0) | 2021.12.17 |
Coding Test(다이나믹 프로그래밍) (0) | 2021.12.16 |
Coding Test(이진 탐색) (0) | 2021.12.16 |