파이썬의 리스트를 복사하는 방법은 얕은 복사(copy)와 깊은 복사(deepcopy)가 있다.
여기서 주의할 점이 있는데, 리스트 자체를 대입하게 되면 내가 의도한 대로 복사가 되지 않는다.
내가 의도한 대로 배열을 복사를 하기 위해서는 얕은 복사와 깊은 복사 방식을 사용해야 한다.
- 리스트 대입
a = [1,2,3] 인 리스트를 b = a로 한 경우, a와 b는 다른 리스트가 아님
# 리스트 대입하는 경우
a = [1,2,3]
b = a
b.append(4)
#a 와 b 모두 6 추가됨.
print(a) # [1, 2, 3, 4]
print(b) # [1, 2, 3, 4]
리스트를 복사하기 위해서는 copy() 를 사용하거나 deepcopy()를 사용해야 한다.
이 둘은 얕은 복사(shallow) 와 깊은 복사(deep)의 차이점이 있는데,
그 차이점은 헷갈릴수 있으니 예제를 보면서 이해하는 것이 좋다.
- 얕은 복사(shallow) : 내장함수 copy() 사용 또는 copy 객체의 copy() 메서드 사용
#얕은 복사(shallow), 내장함수 사용
a = [1,2,3]
b = a.copy()
b.append(5)
# copy() 된 c 에만 7이 추가됨
print(a) # [1, 2, 3, 4]
print(b) # [1, 2, 3, 4, 5]
#얕은 복사(shallow), copy 객체 import 하여 사용
import copy
a = [1,2,3]
b = copy.copy(a)
b.append(4)
print(a) #[1, 2, 3]
print(b) #[1, 2, 3, 4]
- 얕은 복사의 문제점
리스트의 원소가 다차원리스트인 경우, 그 값이 변경되면 원본도 같이 변경됨
#얕은 복사 문제점
# 다차원리스트인 경우 해당 값이 그대로 원본과 같이 변경됨
x = [1,2,[3]]
y = x.copy()
y[2][0] = 4
#원본과 같이 4로 변경됨
print(x) #[1, 2, [4]]
print(y) #[1, 2, [4]]
#일반 값은 원본이 변경되지 않음
y[0] = 5
#원본은 변경안됨
print(x) #[1, 2, [4]]
print(y) #[5, 2, [4]]
- 깊은 복사(deep copy)
copy 객체 import 하여 사용한다.
단, deepcopy() 는 객체의 주소를 복사하지 않고 객체 자체인 모든 것을 복사하기 때문에 속도나 성능에는 좋지 않을 수 있다.
하지만, 리스트의 원소값이 다차원 리스트로 구성된 경우에는 deepcopy()를 사용해야 원하는 복사가 된다.
#깊은 복사인 경우 다차원리스트도 분리
import copy
a = [1,2,[3]]
b = copy.deepcopy(a)
b[2][0] = 4
print(a) #[1, 2, [3]]
print(b) #[1, 2, [4]]
b[0] = 5
print(a) #[1, 2, [3]]
print(b) #[5, 2, [4]]
▷ 블로그 내 파이썬 리스트 (배열) 이전 글 참고
☞ 파이썬 자습서 참고 사이트
https://docs.python.org/ko/3/library/copy.html#module-copy
'코딩라이브러리 > 파이썬' 카테고리의 다른 글
파이썬 정렬 sort, sorted (with 백준 2750, 5597, 1181) (0) | 2024.05.24 |
---|---|
파이썬 for while 조건문 (with 백준 2446, 2522) (2) | 2024.05.23 |
파이썬 리스트 배열 list (with 백준 5597, 10250) (0) | 2024.05.22 |
파이썬 if문 조건 여러개 다중 처리 배열 비교 (with 백준 1330) (0) | 2024.05.21 |
파이썬 문자열 formatter string (with 백준 2739) (0) | 2024.05.20 |