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:

TipeIndexingSlicingBisa mengubah elemen lewat index
listyayaya
tupleyayatidak (immutable)
stryayatidak (immutable)
settidaktidak—
dictionarytidaktidakakses via key

Set dan dictionary menolak akses posisi secara langsung. Percobaan berikut memperlihatkan penolakan tersebut:

python
>>> angka = {1, 2, 3}
>>> angka[0]
Traceback (most recent call last):
  ...
TypeError: 'set' object is not subscriptable

Istilah 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.

python
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:

text
apel
anggur
pisang
p
n

Indeks 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.

python
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:

text
['jeruk', 'mangga']
['apel', 'jeruk']
['mangga', 'pisang', 'anggur']
['apel', 'mangga', 'anggur']
['anggur', 'pisang', 'mangga', 'jeruk', 'apel']
yth
nohtyp

Mari kita baca tiap baris hasil:

  1. buah[1:3]: mengambil indeks 1 dan 2; indeks 3 sebagai batas stop ditinggalkan.
  2. buah[:2] dan buah[2:]: start atau stop yang kosong menandakan “dari ujung” dan “sampai ujung”.
  3. buah[::2]: step 2 melompati setiap satu elemen, menghasilkan indeks 0, 2, dan 4.
  4. buah[::-1] dan teks[::-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.

python
asli = [1, 2, 3, 4, 5]
potongan = asli[1:4]

potongan[0] = 99
print("potongan:", potongan)
print("asli    :", asli)

Output yang Dihasilkan:

text
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:

python
>>> teks = "python"
>>> teks[0] = "P"
Traceback (most recent call last):
  ...
TypeError: 'str' object does not support item assignment

Cara 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.