본문 바로가기
Computer Science/Algorithm

list, dict, set은 mutable 하다. Shallow Copy & Deep Copy

by 9루트 2023. 2. 20.

문제 출처: https://www.acmicpc.net/problem/7576

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

# 입력 받은 모든 토마토 상태 그래프
graph = [list(map(int, input().split())) for _ in range(n)]
# 모든 토마토가 익었을 때의 그래프
finish_graph = graph
print(graph)
for i in range(n):
    for j in range(m):
        if finish_graph[i][j] == 0:
            finish_graph[i][j] = 1
print(graph)

 

graph 출력 결과

[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1]]
[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]]

 

기존  graph 값이 변해버렸다. > shallow copy 결과

 

deep copy는 전체 복사로 참조값의 복사가 아닌 참조된 객체 자체를 복사하는 것

- copy모듈의 deepcopy() 이용

import copy

# 입력 받은 모든 토마토 상태 그래프
graph = [list(map(int, input().split())) for _ in range(n)]
# 모든 토마토가 익었을 때의 그래프
finish_graph = copy.deepcopy(graph)
print(graph)
for i in range(n):
    for j in range(m):
        if finish_graph[i][j] == 0:
            finish_graph[i][j] = 1
print(graph)

graph 출력 결과

 

[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1]]
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1]]

graph 자체는 변하지 않게 된다.

 

자세한 설명은 

아래 블로그 참고하면 된다.

https://crackerjacks.tistory.com/14

 

파이썬 (Python) - 깊은 복사 (Deep Copy)

파이썬 (Python) - 깊은 복사 (Deep Copy) 알고리즘을 풀다 보면 원본배열의 보존을 위해 배열을 복사할 필요를 느낄때가 많다. 객체를 무작정 복사해서 사용하면 원본 객체가 핸들링되어 데이터가 변

crackerjacks.tistory.com