>백엔드 개발 >파이썬 튜토리얼 >Python의 목록 슬라이싱은 복사본을 생성합니까?

Python의 목록 슬라이싱은 복사본을 생성합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-10 03:04:02607검색

 Does Python's List Slicing Create Copies?

복사하지 않고 Python에서 목록 분할: 탐구

목록을 분할하면 새로운 복사본이 생성되는 것처럼 보일 수 있지만, 그 안에 숨겨진 진실은 다른. 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)))

오버헤드에도 불구하고 목록을 조각화하는 것은 완전히 새로운 목록을 만드는 것에 비해 여전히 더 효율적인 접근 방식입니다.

Views and Numpy Arrays< ;/h3>

Python은 목록 보기를 생성하는 기본 방법을 제공하지 않습니다. 그러나 numpy 배열은 슬라이스와 원본 배열 간에 메모리를 공유하여 메모리를 절약하는 솔루션을 제공합니다. 원래 배열에 대한 수정 사항은 조각에 반영됩니다.

import numpy

a = numpy.arange(3)
b = a[1:3]

a[2] = 1001
b  # Output: array([   1, 1001])

그러나 뷰를 사용하려면 의도하지 않은 수정을 피하기 위해 신중한 고려가 필요합니다.

위 내용은 Python의 목록 슬라이싱은 복사본을 생성합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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