>  기사  >  백엔드 개발  >  Python 목록 조각화는 객체의 복사본을 생성합니까?

Python 목록 조각화는 객체의 복사본을 생성합니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-06 07:01:03954검색

 Does Python List Slicing Create Copies of Objects?

Python의 목록 분할: 객체 무결성 유지

Python의 목록 분할이 객체의 복사본을 생성한다고 가정하는 것이 논리적으로 보일 수도 있지만 포함된 개체는 실제로는 그렇지 않습니다. 대신, 슬라이싱은 동일한 기본 개체를 참조하는 새 목록을 생성합니다. 이러한 인식은 Python의 목록 슬라이싱 메커니즘을 이해하는 데 중요한 역할을 합니다.

불변성

정수 목록을 고려하세요.

[1000 + 1, 1000 + 1, 1000 + 1]

동일한 값을 갖고 있음에도 불구하고 이러한 개체는 다음에서 알 수 있듯이 고유한 ID를 가진 별개의 개체입니다.

map(id, [1000 + 1, 1000 + 1, 1000 + 1])

이 목록을 분할하면 이러한 참조의 무결성이 유지됩니다.

b = [1000 + 1, 1000 + 1, 1000 + 1][1:3]
map(id, b)

두 맵 작업의 출력은 동일하며, 이는 슬라이스가 정수의 새로운 복사본을 생성하지 않음을 확인합니다.

변경 가능한 객체는 유사하게 동작

유사한 동작이 관찰됩니다. 사전이나 목록과 같은 변경 가능한 객체 사용:

a = [{0: 'zero', 1: 'one'}, ['foo', 'bar']]
map(id, a[1:])

슬라이싱은 원래 참조를 그대로 유지하여 슬라이싱이 복사가 아닌 작업임을 보여줍니다.

복사 오버헤드< ;/h3>

슬라이싱은 개체 자체를 복사하는 것은 아니지만 참조를 복사합니다. 64비트 시스템에서 각 참조는 8바이트를 차지하고 각 목록에는 추가로 72바이트의 오버헤드가 있습니다.

for i in range(len(a)):
    x = a[:i]
    print('len: {}'.format(len(x)))
    print('size: {}'.format(sys.getsizeof(x)))

그럼에도 불구하고 이 오버헤드는 일반적으로 대부분의 애플리케이션에서 큰 문제가 되지 않습니다.

대안: 뷰

파이썬에는 뷰에 대한 직접적인 지원이 부족하지만 numpy 배열과 같은 대체 옵션을 사용하여 메모리 최적화를 달성할 수 있습니다. numpy 배열을 분할하면 원본과 메모리를 공유하는 뷰가 생성되어 오버헤드가 줄어들지만 의도하지 않은 수정이 발생할 가능성이 있습니다.

요약하자면, Python의 목록 분할은 포함된 객체에 대한 참조를 보존하여 비용이 많이 드는 복사 작업을 방지합니다. 이 메커니즘은 조각이 원래 목록에 대한 변경 사항을 반영하도록 하여 코드 유지 관리를 단순화합니다. 메모리 오버헤드는 고려 사항이지만 일반적으로 대부분의 실제 애플리케이션에서는 큰 문제가 되지 않습니다.

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

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