✅ 리스트 복사 시 = 대입을 사용하면 의도한 복사가 되지 않음
✅ 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
'코딩라이브러리 > 파이썬' 카테고리의 다른 글
파이썬 정렬 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 |