목록을 분할하면 새로운 복사본이 생성되는 것처럼 보일 수 있지만, 그 안에 숨겨진 진실은 다른. Python의 슬라이싱 메커니즘은 목록 요소를 복제하는 대신 목록 요소에 대한 참조를 유지합니다. 이 동작은 불변 값과 가변 값 모두에 적용됩니다.
정수 객체가 포함된 목록을 고려하세요.
a = [1000 + 1, 1000 + 1, 1000 + 1]
동일한 값을 갖고 있음에도 불구하고 각 정수는 고유한 ID를 가진 고유한 개체입니다.
map(id, a) [140502922988976, 140502922988952, 140502922988928]
목록을 조각화하면
b = a[1:3]
조각에 있는 개체의 ID가 다음과 같다는 것을 알 수 있습니다. 원래 목록의 내용과 동일합니다. 복사본이 만들어지지 않았습니다.
마찬가지로 사전과 같은 변경 가능한 값은 동일한 방식으로 동작합니다.
a = [{0: 'zero', 1: 'one'}, ['foo', 'bar']] map(id, a) [4380777000, 4380712040] map(id, a[1:] ... ) [4380712040]
객체 참조는 슬라이싱 중에 복사되며 해당 크기는 일정하게 유지됩니다(64비트 시스템에서는 8바이트). 또한 각 목록에는 72바이트의 오버헤드가 있습니다. 이 오버헤드는 조각이 생성될 때마다 증가합니다.
for i in range(len(a)): x = a[:i] print('len: {}'.format(len(x))) print('size: {}'.format(sys.getsizeof(x)))
오버헤드에도 불구하고 목록을 조각화하는 것은 완전히 새로운 목록을 만드는 것에 비해 여전히 더 효율적인 접근 방식입니다.
Python은 목록 보기를 생성하는 기본 방법을 제공하지 않습니다. 그러나 numpy 배열은 슬라이스와 원본 배열 간에 메모리를 공유하여 메모리를 절약하는 솔루션을 제공합니다. 원래 배열에 대한 수정 사항은 조각에 반영됩니다.
import numpy a = numpy.arange(3) b = a[1:3] a[2] = 1001 b # Output: array([ 1, 1001])
그러나 뷰를 사용하려면 의도하지 않은 수정을 피하기 위해 신중한 고려가 필요합니다.
위 내용은 Python의 목록 슬라이싱은 복사본을 생성합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!