[Python] 2차원 리스트 깊은 복사, 2가지 방법
April 19, 2024
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]]