오뚝이개발자

[Python] 얕은 복사(shallow copy)와 깊은 복사(deep copy) 본문

Language/파이썬

[Python] 얕은 복사(shallow copy)와 깊은 복사(deep copy)

땅어 2021. 4. 12. 15:43
728x90
300x250

 

dfs, bfs, 백트래킹 문제들을 풀 때 기존의 2차원 리스트를 변경하고 원상태로 다시 되돌려야 할 때가 있다.(예컨대, 방문한 곳의 값을 변경한다거나, 특정 조건에 따른 위치의 값을 변경한다거나) 이 때 만약 처음의 상태를 arr에 저장해두었다고 하고, 이를 복사해 탐색하는 함수(예컨대, dfs나 bfs)의 인자로 넘겨 그래프 탐색을 한다고 하자. 만약 arr를 그대로 함수의 인자로 넘겨버리면 arr의 값이 변경된 채로 다음 탐색을 이어가기 때문에 이를 재사용할 경우에 문제가 된다.

이럴 때 사용할 수 있는 것이 바로 deep copy다. deep copy는 copy라는 모듈을 import해서 사용할 수 있다.

>>> import copy
>>> a = [[1,2],[3,4]]
>>> b = copy.deepcopy(a)
>>> a[1].append(5)
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4]]

위에서처럼 b는 a를 복사했지만 내부의 원소를 바꾸어도 기존의 a에는 영향이 없다. 완전히 새로운 객체(심지어 내부의 원소들까지도)를 만들어 정확히 말하자면, 둘 간의 변수 주소 조차도 다른 것이다.(좀 더 깊게 들어가면 mutable한 원소인지 아닌지에 따라서도 복잡해지지만 그건 차치하고...)

 

반대로, b의 원소를 변경했을 때 a에도 영향이 있는 경우를 shallow copy라고 한다.(보통 슬라이싱을 통해 복사하는 것처럼 일반적인 경우가 대게 shallow copy에 속한다)

 

728x90
300x250
Comments