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
'Python' 카테고리의 다른 글
[코딩테스트/Python] 내가 필요해서 정리하는 파이썬 내장함수, 연산기호, 리스트 선언 (0) | 2022.11.20 |
---|---|
[Python] map() 함수 / 여러 input 값의 자료형을 한 번에 바꾸는 방법 (0) | 2021.08.31 |
[Python] 비교 연산자와 논리 연산자의 Boolean 값 차이 (==, !=와 is, is not의 차이) (0) | 2021.08.31 |
[Python] 파이썬 객체지향 프로그래밍 / 클래스, 인스턴스, 메서드 정리 (0) | 2021.07.16 |