Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy) 완벽 정리

Python에는 copy라는 전용 모듈이 내장되어 있으며, 이를 활용하면 객체의 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)를 손쉽게 수행할 수 있습니다.

중요한 점은 Python에서 대입문(=) 자체는 객체를 복사하지 않는다는 사실입니다. 대입문은 단순히 대상 변수와 원본 객체 사이에 참조(바인딩)를 연결해 줄 뿐입니다. 따라서 객체를 실제로 복제하려면 copy 모듈을 사용해야 합니다.

모듈을 사용하기 위해서는 먼저 아래와 같이 임포트합니다.

import copy

copy.copy(x) — 얕은 복사(Shallow Copy)

이 메서드는 객체 x의 얕은 복사본을 생성합니다. 얕은 복사는 원본 객체에 대한 참조만 새로운 객체로 전달하는 방식입니다. 그 결과, 복사된 참조를 통해 내부 데이터를 변경하면 원본 객체의 내용도 함께 변경됩니다. 즉, 최상위 객체만 새로 만들어지고 내부에 포함된 하위 객체들은 원본과 공유됩니다.

copy.deepcopy(x) — 깊은 복사(Deep Copy)

이 메서드는 객체 x의 깊은 복사본을 생성합니다. 깊은 복사는 원본 객체의 데이터를 기반으로 완전히 독립적인 새 객체를 만듭니다. 내부의 모든 중첩 객체까지 재귀적으로 복제되므로, 복사본에서 어떤 값을 수정하더라도 원본 객체는 전혀 영향을 받지 않습니다.

예제 코드

아래 예제는 행렬(2차원 리스트)을 대상으로 얕은 복사와 깊은 복사의 차이를 보여줍니다.

import copy

my_mat = [[11,22,33],[44,55,66],[11,22,33]]
print('Matrix Before Updation: ' + str(my_mat))

# 얕은 복사 후 복사본 수정
new_mat = copy.copy(my_mat)
new_mat[2][0] = 77
new_mat[2][1] = 88
new_mat[2][2] = 99

print('Matrix After Updation: ' + str(my_mat))  # 원본 행렬도 함께 변경됨

my_mat = [[11,22,33],[44,55,66],[11,22,33]]
new_mat_deep = copy.deepcopy(new_mat)

print('\nMatrix Before Updation: ' + str(my_mat))

# 깊은 복사 후 복사본 수정
new_mat_deep[2][0] = 77
new_mat_deep[2][1] = 88
new_mat_deep[2][2] = 99

print('Matrix After Updation: ' + str(my_mat))       # 원본 행렬은 변경되지 않음
print('New Matrix: ' + str(new_mat_deep))            # 복사본만 변경됨

실행 결과

Matrix Before Updation: [[11, 22, 33], [44, 55, 66], [11, 22, 33]]
Matrix After Updation: [[11, 22, 33], [44, 55, 66], [77, 88, 99]]

Matrix Before Updation: [[11, 22, 33], [44, 55, 66], [11, 22, 33]]
Matrix After Updation: [[11, 22, 33], [44, 55, 66], [11, 22, 33]]
New Matrix: [[11, 22, 33], [44, 55, 66], [77, 88, 99]]

정리

  • 대입 연산자(=): 객체를 복사하지 않고 참조만 공유합니다.
  • copy.copy(): 얕은 복사 — 최상위 객체만 복사하고 내부 객체는 원본과 공유하므로, 복사본 수정 시 원본도 영향을 받습니다.
  • copy.deepcopy(): 깊은 복사 — 중첩된 모든 객체까지 완전히 복제하므로, 복사본을 수정해도 원본은 안전하게 유지됩니다.