본문 바로가기
코딩라이브러리/파이썬

파이썬 리스트 배열의 얕은 복사(copy), 깊은 복사(deepcopy) 차이점

by 유니네 라이브러리 2024. 5. 22.

파이썬의 리스트를 복사하는 방법은 얕은 복사(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]]

 

▷ 블로그 내 파이썬 리스트 (배열) 이전 글 참고

 

파이썬 리스트 배열 list (with 백준 5597, 10250)

파이썬의 리스트는 대괄호 사이에 쉼표로 구분된 값들로 표현한다.일차원 리스트A = ['a', 'b', 'c', 'd', 'e']B = ['가', '나', '다', '라', '마']print(A) # ['a', 'b', 'c', 'd', 'e']print(B) # ['가', '나', '다', '라', '마

yuneenelife.tistory.com

 

☞ 파이썬 자습서 참고 사이트
https://docs.python.org/ko/3/library/copy.html#module-copy

 

copy — Shallow and deep copy operations

Source code: Lib/copy.py Assignment statements in Python do not copy objects, they create bindings between a target and an object. For collections that are mutable or contain mutable items, a copy ...

docs.python.org