2차원 리스트를 깊은 복사(deep copy) 방식으로 복사하는 방법에 대해서 알아보겠습니다.

1. copy.deepcopy()를 이용한 방법

copy.deepcopy(original_list)는 original_list를 깊은 복사한 리스트를 리턴합니다.

  • 깊은 복사로 리스트를 복사하면, 원본 또는 복사된 리스트를 변경했을 때 서로의 객체 값을 변경하지 않음
  • 얕은 복사로 리스트를 복사하면, 원본 또는 복사된 리스트의 값 변경 시, 동시에 값이 변경 됨

아래와 같이 deepcopy()로 복사하고, 값을 변경한 뒤에 다시 결과를 출력해보면 서로의 객체 값에 영향을 주지 않는 것을 확인할 수 있습니다.

import copy

original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 2차원 리스트를 깊은 복사
copied_list = copy.deepcopy(original_list)

# 원본과 복사본 출력
print("Original List:", original_list)
print("Copied List:", copied_list)

# 값 변경
copied_list[0][0] = 10
copied_list[1][0] = 20
copied_list[2][0] = 30

# 원본과 복사본 출력
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Copied List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Original List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Copied List: [[10, 2, 3], [20, 5, 6], [30, 8, 9]]

2. 리스트 컴프리헨션을 이용한 방법

리스트 컴프리헨션을 이용하여 깊은 복사를 할 수 있습니다.

아래와 같이 2차원 리스트에 대해서 리스트 슬라이싱을 이용하여 1차원 리스트를 복사하고, 그 리스트를 2차원 리스트에 저장합니다.

  • for문으로 순회하면서 값들을 복사하는 것과 동일
  • row[:] : 리스트 슬라이싱으로, row 리스트의 전체 범위를 잘라서 새로운 리스트를 리턴
import copy

original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 2차원 리스트를 깊은 복사
copied_list = [row[:] for row in original_list]

# 원본과 복사본 출력
print("Original List:", original_list)
print("Copied List:", copied_list)

# 값 변경
copied_list[0][0] = 10
copied_list[1][0] = 20
copied_list[2][0] = 30

# 원본과 복사본 출력
print("Original List:", original_list)
print("Copied List:", copied_list)

Output:

Original List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Copied List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Original List: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Copied List: [[10, 2, 3], [20, 5, 6], [30, 8, 9]]