코딩라이브러리/파이썬

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

유니네 라이브러리 2024. 5. 22. 20:48

리스트 복사 시 = 대입을 사용하면 의도한 복사가 되지 않음

copy()는 얕은 복사(shallow copy), deepcopy()는 깊은 복사(deep copy)

다차원 리스트에서는 deepcopy()를 사용해야 안전한 복사 가능

 

📌 리스트 대입은 복사가 아니다!

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

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

🔹 b = a는 새로운 리스트를 만든 것이 아니라 같은 메모리 주소를 공유하는 것

🔹 따라서 b를 수정하면 a도 함께 변경된다.

 

📌 얕은 복사(shallow copy)

 

리스트를 독립적으로 복사하려면 copy() 사용

다차원 리스트에서는 문제가 발생할 수 있음

 

🔹 1차원 리스트 - 정상 동작

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

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

copy()를 사용하면 새로운 리스트가 생성되므로 b만 변경된다.

 

🔹 다차원 리스트 - 원본까지 변경됨

x = [1, 2, [3]]
y = x.copy()
y[2][0] = 4

print(x)  # [1, 2, [4]]
print(y)  # [1, 2, [4]]

🔸 copy()리스트 자체는 복사하지만 내부 리스트는 공유된다.

🔸 즉, y[2][0] = 4를 변경하면 x도 함께 변경된다.

 

다차원 리스트를 복사할 때는 deepcopy()를 사용해야 한다.

 

📌 깊은 복사(deep copy)

 

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]]

deepcopy()를 사용하면 내부 리스트까지 완전히 독립적으로 복사된다.

이제 b를 변경해도 a는 영향을 받지 않는다.

 

📌 copy() vs deepcopy() 비교 정리

복사 방식 독립적 복사 다차원 리스트 복사 성능
= 대입 ❌ (같은 주소) 빠름
copy() ✅ (1차원 리스트만) ❌ (내부 리스트는 공유됨) 빠름
deepcopy() ✅ (완전한 독립) ✅ (내부 리스트까지 복사) 느림

다차원 리스트를 다룰 때는 deepcopy()를 사용해야 원본 데이터가 안전하다.

deepcopy()는 속도가 느릴 수 있으므로 필요할 때만 사용한다.

 

📌 마무리 - 리스트 복사의 핵심 정리

 

b = a새로운 리스트를 생성하는 것이 아니라 같은 리스트를 공유한다.

copy()를 사용하면 1차원 리스트는 안전하게 복사되지만, 다차원 리스트는 공유된다.

deepcopy()를 사용하면 다차원 리스트도 완전히 복사 가능하다.

 

👉 파이썬 자습서 참고 사이트

 

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