Adakah Penghirisan Senarai Python Mencipta Salinan?

Linda Hamilton
Lepaskan: 2024-11-10 03:04:02
asal
566 orang telah melayarinya

 Does Python's List Slicing Create Copies?

Menghiris Senarai dalam Python Tanpa Menyalin: Penerokaan

Walaupun menghiris senarai mungkin kelihatan seperti mencipta salinan baharu, kebenaran yang mendasarinya adalah agak berbeza. Mekanisme penghirisan Python mengekalkan rujukan kepada elemen senarai, dan bukannya menduplikasinya. Tingkah laku ini digunakan pada kedua-dua nilai tidak berubah dan boleh berubah.

Menguji Nilai Kekal dan Boleh berubah

Pertimbangkan senarai yang mengandungi objek integer:

a = [1000 + 1, 1000 + 1, 1000 + 1]
Salin selepas log masuk

Walaupun mempunyai nilai yang sama, setiap integer adalah objek berbeza dengan unik ID:

map(id, a)
[140502922988976, 140502922988952, 140502922988928]
Salin selepas log masuk

Menghiris senarai:

b = a[1:3]
Salin selepas log masuk

mendedahkan bahawa ID objek dalam hirisan adalah sama dengan yang ada dalam senarai asal. Tiada salinan telah dibuat.

Begitu juga, nilai boleh ubah seperti kamus berkelakuan dengan cara yang sama:

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

map(id, a[1:]
... )
[4380712040]
Salin selepas log masuk

Minimal Overhead Memori

Semasa rujukan objek disalin semasa menghiris, saiznya kekal malar (8 bait pada mesin 64-bit). Selain itu, setiap senarai mempunyai overhed 72 bait. Overhed ini meningkat dengan setiap keping yang dibuat:

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

Walaupun overhed, menghiris senarai masih merupakan pendekatan yang lebih cekap berbanding dengan mencipta senarai baharu sepenuhnya.

Views and Numpy Arrays< ;/h3>

Python tidak menawarkan cara asli untuk mencipta paparan senarai. Walau bagaimanapun, tatasusunan numpy menyediakan penyelesaian untuk menjimatkan memori dengan berkongsi memori antara kepingan dan tatasusunan asal. Pengubahsuaian yang dibuat pada tatasusunan asal ditunjukkan dalam kepingan:

import numpy

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

a[2] = 1001
b  # Output: array([   1, 1001])
Salin selepas log masuk

Walau bagaimanapun, menggunakan pandangan memerlukan pertimbangan yang teliti untuk mengelakkan pengubahsuaian yang tidak diingini.

Atas ialah kandungan terperinci Adakah Penghirisan Senarai Python Mencipta Salinan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan