목록 심층 복사: 얕은 접근 방식을 넘어서
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!