Python

[Python] copy(), deepcopy()의 차이 / 파이썬으로 list, array값 복사하기

쟈비쓰 2021. 9. 16. 09:41
728x90

알고리즘을 짜다보면 값을 복사해둬야 할 때가 있다.

Input 센서 값을 알고리즘에서 활용하거나, 하나의 배열(array)값을 여러 곳에 쓰거나 등등 다양한 이유가 있다.

 

 

1. copy() - Python 기본 내장 함수

단순히 같은 값을 가진 1차원 시퀀스에 대해서는 파이썬의 내장 함수인 copy()를 쓰면 된다.

a = [1, 2, 3]
b = a.copy()

print(a)  # [1, 2, 3]
print(b)  # [1, 2, 3]


a[0] = 4

print(a)  # [4, 2, 3]
print(b)  # [1, 2, 3]

 

위 코드 블럭을 보면 알 수 있듯이 이렇게 복사한 list에 대해서는 값을 바꿔도 원본 list 의 값은 변하지 않는다.

즉, 이미 copy 된 list는 더 이상 원본 list에 영향을 미치지 않는다.

 

 

그렇지만 문제는 2차원 이상의 list, array에서 발생한다.

2차원인 경우 위와 유사하게 코드를 작성하면 아래와 같은 결과를 얻는다.

a = [[1, 2, 3], [4, 5, 6]]
b = a.copy()
b[0][0] = 7

print(a)  # [[7, 2, 3], [4, 5, 6]]
print(b)  # [[7, 2, 3], [4, 5, 6]]

이때 사용할 수 있는 방법이 copy 라이브러리를 import해서 copy.deepcopy()를 사용하는 방법이다.

 

 

2. deepcopy()

deepcopy()는 단순 복제를 하는 copy()와는 달리 별개의 복제된 버전을 생성해준다.

그렇게 때문에 deepcopy된 값의 버전은 더 이상 원본에 서로 영향을 주고받지 않는다.

 

아래 코드에서도 확인할 수 있다.

import copy

a = [[1, 2, 3], [4, 5, 6]]
b = copy.deepcopy(a)  # copy라이브러리의 deepcopy사용
b[0][0] = 7

print(a)  # [[1, 2, 3], [4, 5, 6]]
print(b)  # [[7, 2, 3], [4, 5, 6]]

 

위에서 2차원 리스트에 copy()만 사용했을 때와 달리 deepcopy된 값에 변화를 줘도 원본에 영향을 미치지 않는다.

 

728x90