깊고 얕은 복사가 무엇인지 이야기하기 전에 먼저 이 현상을 살펴보겠습니다.
a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b
왜 b만 수정하는데 a에 영향을 미치나요? 나는 이전 기사에서 내가 말한 것을 보았습니다: 모든 메모리 참조는 시퀀스에 저장됩니다.
그래서 b를 통해 내부의 빈 리스트를 수정하면 실제로는 메모리에 있는 동일한 객체를 수정하는 것이므로 a에 영향을 미치게 됩니다.
a = ['scolia', 123, [], ] b = a[:] print id(a), id(a[0]), id(a[1]), id(a[2]) print id(b), id(b[0]), id(b[1]), id(b[2])
코드가 올바르게 확인되었으므로 a와 b가 서로 다른 객체이지만 내부 참조는 모두 동일합니다. . 이것은 소위 새로운 객체, 오래된 콘텐츠입니다.
그러나 얕은 사본은 그것만이 아닙니다. 아래를 보십시오:
a = ['scolia', 123, [], ] b = a[:] b[1] = 666 print a print b
여기서 무슨 일이 일어나고 있나요? 무슨 일이야?
파이썬에서 변수 할당에 대한 지침을 읽은 학생들은 문자열이나 숫자와 같은 불변 데이터 유형의 경우 수정이 재할당과 동일하다는 사실을 알게 될 것입니다. 여기서는 참조를 새로 고치는 것과 같습니다.
코드 확인:
a = ['scolia', 123, [], ] b = a[:] b[1] = 666 print id(a), id(a[0]), id(a[1]), id(a[2]) print id(b), id(b[0]), id(b[1]), id(b[2])
그런 것 같습니다 맞습니다.
위에서 이야기한 것은 얕은 복사입니다. 요약하면 얕은 복사는 복사된 개체의 수정 가능한 데이터 유형을 수정하는 경우에만 참조를 변경하므로 영향을 미칩니다. 원래 개체. 수정 불가능한 개체를 수정하면 새 개체가 생성되고 참조가 새로 고쳐지므로 원본 개체에 대한 참조가 달라지고 결과도 달라집니다.
얕은 복사본을 만드는 방법:
1. 슬라이싱 작업
2. 새로운 객체를 생성합니다. ( b = list(a) )
따라서 심층 복사란 내부에서 참조된 개체를 다시 만들고 새로운 일련의 참조를 생성하는 것을 의미합니다.
기본적으로는 이렇지만 문자열, 숫자 등 수정이 불가능한 객체의 경우 새로 복사본을 생성하는 것은 좀 아깝다는 생각이 듭니다. 어쨌든 수정하고 싶을 때 새로운 객체를 생성하고 참조를 새로 고칩니다. 따라서 원본 참조를 계속 사용하더라도 문제가 되지 않으며 메모리 절약이라는 목적도 달성할 수 있습니다.
코드 확인을 보세요:
from copy import deepcopy a = ['scolia', 123, [], ] b = deepcopy(a) b[1] = 666 print id(a), id(a[0]), id(a[1]), id(a[2]) print id(b), id(b[0]), id(b[1]), id(b[2])
인증됨 정확하게 .
deep copy 생성:
1. 코드 예시에서 사용한 것처럼 deepcopy() 메서드를 통해서만 생성할 수 있습니다. 내장 복사 모듈.
자, 여기서는 어둡고 얕은 카피 문제에 대한 이야기는 그만 두겠습니다. 오류가 있거나 추가해야 할 사항이 있으면 나중에 계속하겠습니다.
위 Python의 얕은 복사와 깊은 복사에 대한 심층적인 이해에 대한 글은 모두 편집자가 공유한 내용이므로 참고가 되셨으면 좋겠습니다. PHP 중국어 웹사이트를 지원합니다.
파이썬의 얕은 복사와 깊은 복사에 관한 더 많은 글은 PHP 중국어 홈페이지를 주목해주세요!