> 백엔드 개발 > 파이썬 튜토리얼 > Python 목록의 얕은 복사와 깊은 복사: 언제 `copy.deepcopy()`를 사용해야 합니까?

Python 목록의 얕은 복사와 깊은 복사: 언제 `copy.deepcopy()`를 사용해야 합니까?

Mary-Kate Olsen
풀어 주다: 2024-12-09 20:51:11
원래의
807명이 탐색했습니다.

Shallow vs. Deep Copy in Python Lists: When Should I Use `copy.deepcopy()`?

목록 심층 복사: 얕은 접근 방식을 넘어서

list(...)를 사용하여 목록을 복사하려고 하면 id(E0)가 id(E0_copy)와 다르다는 관찰을 기반으로 한 깊은 복사입니다. 그러나 이 가정에는 결함이 있습니다.

Shallow Copying Trap

list(...)는 내부 객체를 재귀적으로 복사하는 전체 복사를 수행하지 않습니다. 대신 원래 내부 목록에 대한 참조를 유지하면서 가장 바깥쪽 목록만 복사합니다. 따라서 내부 목록을 수정하면 원본 목록과 복사된 목록 모두에 영향을 미칩니다.

copy.deepcopy를 사용한 심층 복사

진정한 심층 복사를 생성하려면 복사를 사용하세요. 딥카피(...). 이 방법은 모든 수준의 개체를 반복적으로 복사하여 복사본의 변경 사항이 원본에 영향을 주지 않도록 합니다.

다음 코드 조각을 고려하세요.

>>> a = [[1, 2, 3], [4, 5, 6]]
>>> b = list(a)
>>> a
[[1, 2, 3], [4, 5, 6]]
>>> b
[[1, 2, 3], [4, 5, 6]]
>>> a[0][1] = 10
>>> a
[[1, 10, 3], [4, 5, 6]]
>>> b   # b changes too -> Not a deepcopy.
[[1, 10, 3], [4, 5, 6]]
로그인 후 복사

이 예에서 list(...)는 a의 얕은 복사본을 만듭니다. a[0][1]이 수정되면 b도 변경되어 동일한 내부 목록을 참조함을 나타냅니다.

이를 다음과 대조해 보세요.

>>> import copy
>>> b = copy.deepcopy(a)
>>> a
[[1, 10, 3], [4, 5, 6]]
>>> b
[[1, 10, 3], [4, 5, 6]]
>>> a[0][1] = 9
>>> a
[[1, 9, 3], [4, 5, 6]]
>>> b    # b doesn't change -> Deep Copy
[[1, 10, 3], [4, 5, 6]]
로그인 후 복사

copy.deepcopy를 사용하면, 우리는 a의 진정한 딥 카피를 생성합니다. a에 대한 변경 사항은 b에 영향을 미치지 않으며 내부 목록의 자체 복사본이 있는 별개의 개체임을 확인합니다.

결론

목록 전체 복사가 필수적인 경우 다음 사항을 기억하세요. 복사본의 변경 사항이 원본에 영향을 미치지 않도록 하려면 copy.deepcopy(...)를 사용하십시오. 이러한 이해는 데이터 무결성을 유지하고 코드에서 예상치 못한 결과를 방지하는 데 중요합니다.

위 내용은 Python 목록의 얕은 복사와 깊은 복사: 언제 `copy.deepcopy()`를 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿