>  기사  >  백엔드 개발  >  파이썬의 얕은 복사와 깊은 복사

파이썬의 얕은 복사와 깊은 복사

高洛峰
高洛峰원래의
2017-03-02 15:56:041327검색

깊고 얕은 복사가 무엇인지 이야기하기 전에 먼저 이 현상을 살펴보겠습니다.

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 중국어 홈페이지를 주목해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.