Mengapa tidak 'example'[999:9999]
menghasilkan kesalahan? Sejak'example'[9]
itu, apa motivasi dibaliknya?
Dari perilaku ini saya dapat berasumsi bahwa 'example'[3]
pada dasarnya / secara internal tidak sama 'example'[3:4]
, meskipun keduanya menghasilkan 'm'
string yang sama .
[999:9999]
bukanlah indeks, itu sepotong, dan memiliki semantik yang berbeda. Dari intro python: "Indeks irisan yang menurun ditangani dengan baik: indeks yang terlalu besar diganti dengan ukuran string, batas atas yang lebih kecil dari batas bawah mengembalikan string kosong."Jawaban:
Kamu benar!
'example'[3:4]
dan'example'[3]
pada dasarnya berbeda, dan memotong di luar batas suatu urutan (setidaknya untuk bawaan) tidak menyebabkan kesalahan.Ini mungkin mengejutkan pada awalnya, tetapi masuk akal jika Anda memikirkannya. Pengindeksan mengembalikan satu item, tetapi mengiris mengembalikan item berikutnya. Jadi, saat Anda mencoba mengindeks nilai yang tidak ada, tidak ada yang dikembalikan. Namun saat Anda mengiris urutan di luar batas, Anda masih dapat mengembalikan urutan kosong.
Bagian yang membingungkan di sini adalah string berperilaku sedikit berbeda dari daftar. Lihat apa yang terjadi jika Anda melakukan hal yang sama pada daftar:
>>> [0, 1, 2, 3, 4, 5][3] 3 >>> [0, 1, 2, 3, 4, 5][3:4] [3]
Di sini perbedaannya terlihat jelas. Dalam kasus string, hasilnya tampak identik karena dalam Python, tidak ada karakter individu di luar string. Satu karakter hanyalah string 1 karakter.
(Untuk semantik yang tepat dari mengiris di luar rentang urutan, lihat jawaban mgilson .)
sumber
None
daripada membuat kesalahan - itu adalah konvensi Python biasa ketika Anda tidak memiliki apa pun untuk dikembalikan.None
dalam kasus ini akan membuat lebih sulit untuk membedakan antara indeks di luar batas danNone
nilai di dalam daftar. Tetapi bahkan jika ada solusi untuk itu, tetap jelas bagi saya bahwa mengembalikan urutan kosong adalah hal yang benar untuk dilakukan ketika diberi potongan di luar batas. Ini analog dengan melakukan penyatuan dua set yang terputus-putus.None
nilai dalam daftar.Demi menambahkan jawaban yang mengarah ke bagian yang kuat dalam dokumentasi :
Diberikan ekspresi irisan seperti
s[i:j:k]
,jika Anda menulis
s[999:9999]
, python kembalis[len(s):len(s)]
sejaklen(s) < 999
dan langkah Anda positif (1
- default).sumber
k
positif,i
danj
juga meningkat menjadi-len(s)
saat mereka lebih rendah? misalnyas = 'bac'; s[-100:2] == s[-len(s):2]
k
positif, Python akan menskalakani
danj
agar sesuai dengan batas urutan. Dalam contoh Anda,s[-100:2] == s[0:2]
(== s[-len(s):2]
, omong-omong). Demikian pulas[-100:100] == s[0:2]
.Mengiris tidak dibatasi oleh tipe bawaan. Dan meskipun kedua contoh Anda tampaknya memiliki hasil yang sama, cara kerjanya berbeda; cobalah dengan daftar sebagai gantinya.
sumber