Heim  >  Artikel  >  Backend-Entwicklung  >  Erstellt Pythons List Slicing Kopien?

Erstellt Pythons List Slicing Kopien?

Linda Hamilton
Linda HamiltonOriginal
2024-11-10 03:04:02560Durchsuche

 Does Python's List Slicing Create Copies?

Slicing-Listen in Python ohne Kopieren: Eine Erkundung

Während das Slicing-Listen den Anschein erweckt, neue Kopien zu erstellen, ist die zugrunde liegende Wahrheit eine ganz andere anders. Der Slicing-Mechanismus von Python behält die Verweise auf die Listenelemente bei, anstatt sie zu duplizieren. Dieses Verhalten gilt sowohl für unveränderliche als auch für veränderliche Werte.

Testen unveränderlicher und veränderlicher Werte

Stellen Sie sich eine Liste vor, die ganzzahlige Objekte enthält:

a = [1000 + 1, 1000 + 1, 1000 + 1]

Trotz identischer Werte ist jede Ganzzahl ein eindeutiges Objekt mit einem Unikat ID:

map(id, a)
[140502922988976, 140502922988952, 140502922988928]

Slicing der Liste:

b = a[1:3]

zeigt, dass die IDs der Objekte im Slice mit denen in der Originalliste identisch sind. Es wurden keine Kopien erstellt.

Ähnliche Werte wie Wörterbücher verhalten sich genauso:

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

map(id, a[1:]
... )
[4380712040]

Minimaler Speicheraufwand

While Objektreferenzen werden während des Slicings kopiert, ihre Größe bleibt konstant (8 Bytes auf einem 64-Bit-Computer). Darüber hinaus hat jede Liste einen Overhead von 72 Byte. Dieser Overhead erhöht sich mit jedem erstellten Slice:

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

Trotz des Overheads ist das Slicing von Listen immer noch ein effizienterer Ansatz im Vergleich zur Erstellung völlig neuer Listen.

Views and Numpy Arrays< ;/h3>

Python bietet keine native Möglichkeit, Listenansichten zu erstellen. Numpy-Arrays bieten jedoch eine Lösung zum Speichern von Speicher, indem sie den Speicher zwischen Slices und dem ursprünglichen Array teilen. Am ursprünglichen Array vorgenommene Änderungen werden in den Slices widergespiegelt:

import numpy

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

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

Die Verwendung von Ansichten erfordert jedoch sorgfältige Überlegungen, um unbeabsichtigte Änderungen zu vermeiden.

Das obige ist der detaillierte Inhalt vonErstellt Pythons List Slicing Kopien?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn