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.
Pertimbangkan senarai yang mengandungi objek integer:
a = [1000 + 1, 1000 + 1, 1000 + 1]
Walaupun mempunyai nilai yang sama, setiap integer adalah objek berbeza dengan unik ID:
map(id, a) [140502922988976, 140502922988952, 140502922988928]
Menghiris senarai:
b = a[1:3]
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]
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)))
Walaupun overhed, menghiris senarai masih merupakan pendekatan yang lebih cekap berbanding dengan mencipta senarai baharu sepenuhnya.
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])
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!