Doc Python mengatakan bahwa mengiris daftar mengembalikan daftar baru.
Sekarang jika daftar "baru" dikembalikan, saya memiliki pertanyaan berikut terkait dengan "Penugasan ke irisan"
a = [1, 2, 3]
a[0:2] = [4, 5]
print a
Sekarang hasilnya adalah:
[4, 5, 3]
- Bagaimana bisa sesuatu yang mengembalikan sesuatu muncul di sisi kiri ekspresi?
- Ya, saya membaca dokumen dan dikatakan mungkin, sekarang karena pemotongan daftar menghasilkan daftar "baru", mengapa daftar asli diubah? Saya tidak dapat memahami mekanisme di baliknya.
a[0] = 4
akan dilakukan?=
, jadi alih-alih membuang ini sebagai sintaks yang tidak valid, python mengubahnya menjadi sesuatu yang lebih seperti yang Anda harapkan. Karena python tidak memiliki referensi, itu tidak akan berfungsi jika hasil potongan mengubah daftar aslinya. Anda mendapatkan salinannya. Jika Anda memberikan info lebih lanjut tentang aplikasi Anda, kami mungkin dapat membantu Anda melakukan berbagai hal dengan cara 'pythonic' dengan lebih baik. :)Jawaban:
Anda bingung dengan dua operasi berbeda yang menggunakan sintaks yang sangat mirip:
1) mengiris:
Ini membuat salinan dari potongan
a
dan menetapkannya keb
.2) tugas potong:
Ini menggantikan irisan
a
dengan kontenb
.Meskipun sintaksnya serupa (saya membayangkan desainnya!), Ini adalah dua operasi yang berbeda.
sumber
start=1
,stop=None
. Ini akan menghindari penyalinan dan menggunakan evaluasi malas (dalam kasus Anda akses malas atau daftar asli).Saat Anda menentukan
a
di sisi kiri=
operator, Anda menggunakan tugas normal Python , yang mengubah namaa
dalam konteks saat ini untuk menunjuk ke nilai baru. Ini tidak mengubah nilai sebelumnya yanga
ditunjuk.Dengan menentukan
a[0:2]
di sisi kiri=
operator, Anda memberi tahu Python bahwa Anda ingin menggunakan Slice Assignment . Slice Assignment adalah sintaks khusus untuk daftar, di mana Anda dapat menyisipkan, menghapus, atau mengganti konten dari daftar:Penyisipan :
Penghapusan :
Penggantian :
catatan:
Slice Assignment menyediakan fungsi yang mirip dengan Tuple Unpacking . Misalnya,
a[0:1] = [4, 5]
setara dengan:Dengan Tuple Unpacking, Anda dapat mengubah daftar non-berurutan:
Namun, pembongkaran tuple terbatas pada penggantian, karena Anda tidak dapat memasukkan atau menghapus elemen.
Sebelum dan sesudah semua operasi ini,
a
adalah daftar yang persis sama. Python hanya menyediakan gula sintaksis yang bagus untuk mengubah daftar di tempat.sumber
a[:] = some_list
setara dengana = some_list[:]
ataua = some_list
?a[:] = some_list
menetapkan setiap elemena
menjadi miliksome_list
. Melakukan salah satu dari yang Anda sebutkan akan mengubah apa yanga
ada. Sebagai contoh:a = [1, 2, 3]
b = a
a[:] = [4, 5, 6]
a is b
. Baris terakhir akan menjadi False jika itu mengubaha
nilainya, daripada memutasinya.Saya menemukan pertanyaan yang sama sebelumnya dan ini terkait dengan spesifikasi bahasa. Menurut pernyataan penugasan ,
Jika sisi kiri tugas adalah berlangganan, Python akan memanggil
__setitem__
objek itu.a[i] = x
setara dengana.__setitem__(i, x)
.Jika sisi kiri tugas adalah slice, Python juga akan memanggil
__setitem__
, tetapi dengan argumen yang berbeda:a[1:4]=[1,2,3]
setara dengana.__setitem__(slice(1,4,None), [1,2,3])
Itulah mengapa potongan daftar di sisi kiri '=' berperilaku berbeda.
sumber
Dengan mengiris di sisi kiri operasi tugas, Anda menentukan item mana yang akan ditugaskan.
sumber