본문 바로가기

Python

python. shallow/deep copy

[1. 개요]

python 에서 얕은 복사와 깊은 복사 개념에 대한 내용 정리


[2. 기본 개념]

C++ 를 예로들면, 어떤 객체가 있고 이 객체에 대한 포인터가 있다.

이 객체에 대해서

  • 깊은 복사는 객체를 구성하는 모든 멤버 변수 데이터까지 복사하는 것이고,
  • 얕은 복사는 객체를 가리키는 포인터를 복사하는 것이다.

즉, 깊은 복사 후 해당 객체에 대한 값 변경은 복사에 대상이 된 원래 객체의 데이터 변경을 유도하지 않는다.

그러나 얕은 복사 후 해당 객체에 대해서 동일한 작업을 진행하면 원래 객체의 데이터 변경까지 유도한다.


[3. 예제]

2차원 배열을 선언한다 했을 때...

# shallow copy
board1 = [[0, 0, 0]] * 100000 

# deep copy
board2 = [[0, 0, 0] for i in range(100000)]


board1[0][0] = 10
board1[2][0] = 5
print(board1[0][0], board1[1][0], board1[2][0])
# output: 5 5 5 

board2[0][0] = 10
board2[2][0] = 5
print(board2[0][0], board2[1][0], board2[2][0])
# output: 10 0 5

[0, 0, 0] 이라는 리스트는 하나의 객체(혹은 객체의 주소)라 보고,

리스트에 대해서 * 연산은 리스트내 원소를 얕은 복사로 복사 시킨다.

즉, board1 = [obj, obj, obj] 이런 형태이며, obj 는 모두 같은 객체를 가리키게 된다.

 

for 문을 이용한 경우는 깊은 복사를 하여 의도한 대로 값이 출력됨을 확인 할 수 있다.

 

'Python' 카테고리의 다른 글

[python] bearing  (0) 2024.03.27
[python] haversine distance  (0) 2024.03.27
python. io 성능  (0) 2023.10.04
python. 유용한 코드  (0) 2023.09.07
Package datetime  (0) 2021.11.16