Empat struktur data pada section ini punya kemampuan akses yang berbeda. List dan tuple bisa dibaca per posisi, sedangkan set dan dictionary tidak punya konsep posisi sama sekali. Memahami tipe mana yang mendukung indexing dan slicing — serta bagaimana pola start:stop:step bekerja — membuat kita bisa mengambil bagian mana pun dari koleksi dengan satu baris ekspresi.
Tipe yang Mendukung Indexing dan Slicing #
Indexing dan slicing membutuhkan urutan posisi yang tetap. Hanya tipe sequence yang memilikinya:
| Tipe | Indexing | Slicing | Bisa mengubah elemen lewat index |
|---|---|---|---|
list | ya | ya | ya |
tuple | ya | ya | tidak (immutable) |
str | ya | ya | tidak (immutable) |
set | tidak | tidak | — |
dictionary | tidak | tidak | akses via key |
Set dan dictionary menolak akses posisi secara langsung. Percobaan berikut memperlihatkan penolakan tersebut:
>>> angka = {1, 2, 3}
>>> angka[0]
Traceback (most recent call last):
...
TypeError: 'set' object is not subscriptableIstilah subscriptable mengacu pada kemampuan diakses dengan tanda kurung siku. String sebagai sequence juga mendukung keduanya — pembahasan khususnya tersedia pada Chapter Indexing dan Slicing String. Tuple mendukung slicing dengan pola yang identik dengan list, hanya saja hasilnya tuple baru, misalnya (1, 2, 3)[1:] menghasilkan (2, 3).
Indeks Positif dan Negatif #
Indexing mengambil satu elemen pada posisi tertentu. Indeks positif berhitung dari depan mulai 0; indeks negatif berhitung dari belakang mulai -1. Aturan ini berlaku seragam untuk list, tuple, dan string.
buah = ["apel", "jeruk", "mangga", "pisang", "anggur"]
teks = "python"
print(buah[0])
print(buah[-1])
print(buah[-2])
print(teks[0])
print(teks[-1])Output yang Dihasilkan:
apel
anggur
pisang
p
nIndeks negatif paling berguna untuk dua posisi khas: x[-1] (elemen terakhir) dan x[-2] (elemen kedua dari akhir), tanpa perlu menghitung panjang koleksi dengan len() terlebih dahulu.
Slicing dengan start:stop:step #
Slicing mengambil rentang elemen dengan pola [start:stop:step]. Batas stop bersifat eksklusif — elemen pada posisi stop tidak ikut diambil. Ketiga bagian boleh ditinggal kosong: start kosong berarti dari awal, stop kosong berarti sampai akhir, dan step kosong berarti langkah 1.
buah = ["apel", "jeruk", "mangga", "pisang", "anggur"]
teks = "python"
print(buah[1:3])
print(buah[:2])
print(buah[2:])
print(buah[::2])
print(buah[::-1])
print(teks[1:4])
print(teks[::-1])Output yang Dihasilkan:
['jeruk', 'mangga']
['apel', 'jeruk']
['mangga', 'pisang', 'anggur']
['apel', 'mangga', 'anggur']
['anggur', 'pisang', 'mangga', 'jeruk', 'apel']
yth
nohtypMari kita baca tiap baris hasil:
buah[1:3]: mengambil indeks1dan2; indeks3sebagai batas stop ditinggalkan.buah[:2]danbuah[2:]:startataustopyang kosong menandakan “dari ujung” dan “sampai ujung”.buah[::2]: step2melompati setiap satu elemen, menghasilkan indeks0,2, dan4.buah[::-1]danteks[::-1]: step negatif membaca koleksi dari belakang — idiom baku untuk membalik urutan.
Slicing juga tidak pernah memunculkan IndexError. Rentang yang melewati batas dipangkas secara otomatis, sehingga buah[2:100] valid dan menghasilkan elemen indeks 2 sampai akhir.
Slice pada List Mengembalikan Salinan Baru #
Operasi slicing pada list selalu menghasilkan objek list baru. Mengubah hasil slice tidak menyentuh list aslinya.
asli = [1, 2, 3, 4, 5]
potongan = asli[1:4]
potongan[0] = 99
print("potongan:", potongan)
print("asli :", asli)Output yang Dihasilkan:
potongan: [99, 3, 4]
asli : [1, 2, 3, 4, 5]Baris potongan[0] = 99 hanya mengubah objek salinan; list asli tetap utuh. Perilaku ini kelak menjadi fondasi teknik menyalin list yang akan kita bahas pada Chapter *Shallow Copy dan Deep Copy`.
Perlu dibedakan dengan assignment langsung terhadap elemen list: asli[0] = 99 memang mengubah list aslinya karena list bersifat mutable. String tidak seberuntung itu — mencoba mengubah satu karakter memunculkan TypeError:
>>> teks = "python"
>>> teks[0] = "P"
Traceback (most recent call last):
...
TypeError: 'str' object does not support item assignmentCara mengubah string adalah membangun string baru, misalnya "P" + teks[1:]. Karakteristik immutable ini berlaku juga pada tuple: keduanya bisa diiris, tetapi tidak bisa ditulis ulang.