BAB 16: Tuple

Kenali tuple sebagai tipe data kolektif yang immutable — mirip list tapi isinya tidak bisa diubah setelah dibuat, cocok untuk data yang harus tetap konsisten.

Semua contoh kode dari BAB 14 dan BAB 15 mengandalkan list — dan salah satu kekuatan utama list adalah sifat mutable-nya: elemen bisa ditambah, dihapus, diubah, dan diurutkan ulang kapan saja. Tapi justru kebebasan itu kadang menjadi masalah. Bayangkan data koordinat peta (latitude, longitude) atau kode warna RGB (255, 128, 0) — data semacam ini seharusnya tidak berubah setelah dibuat. Menggunakan list untuk menyimpan data yang tidak boleh berubah sama saja membuka pintu bagi bug yang sulit dilacak.

Python menyediakan tuple untuk kebutuhan ini: tipe data kolektif yang immutable. Sekali dibuat, isinya terkunci — tidak bisa ditambah, dihapus, atau diubah.

Membuat Tuple

Tuple dibuat dengan tanda kurung (), dan setiap elemen dipisahkan koma — mirip list, tapi dengan kurung biasa alih-alih kurung siku.

# kuis.py — data konfigurasi kuis yang tidak boleh berubah
kode_kuis = ("KS", 2026, "Python Dasar")
print(kode_kuis)
print(type(kode_kuis))
('KS', 2026, 'Python Dasar')
<class 'tuple'>

Tuple kosong juga valid:

# kuis.py
kosong = ()
print(len(kosong))
0

Tuple Satu Elemen

Ada satu jebakan yang sering membuat pemula bingung: tuple dengan satu elemen harus diakhiri koma. Tanpa koma, Python menganggapnya sebagai ekspresi biasa dalam tanda kurung.

# kuis.py — perhatikan perbedaannya
bukan_tuple = ("Python Dasar")
tuple_asli = ("Python Dasar",)

print(type(bukan_tuple))
print(type(tuple_asli))
<class 'str'>
<class 'tuple'>

Koma di akhir ("Python Dasar",) itulah yang membuat Python mengenalinya sebagai tuple, bukan sekadar string di dalam tanda kurung.

Tanpa Tanda Kurung

Tanda kurung pada tuple sebenarnya opsional — Python mengenali tuple dari koma yang memisahkan nilai.

# kuis.py
kode_kuis = "KS", 2026, "Python Dasar"
print(kode_kuis)
print(type(kode_kuis))
('KS', 2026, 'Python Dasar')
<class 'tuple'>

Meskipun valid, menulis tanda kurung secara eksplisit tetap disarankan karena membuat kode lebih mudah dibaca — terutama saat tuple menjadi argumen fungsi atau bagian dari ekspresi yang lebih panjang.

Mengakses Elemen Tuple

Cara mengakses elemen tuple persis sama dengan list: gunakan index di dalam kurung siku. Index dimulai dari 0, dan index negatif menghitung dari belakang.

# kuis.py
kode_kuis = ("KS", 2026, "Python Dasar")

print(kode_kuis[0])
print(kode_kuis[-1])
KS
Python Dasar

Slicing yang sudah kita pelajari di BAB 15 juga bekerja untuk tuple:

# kuis.py
peserta_tetap = ("Rina", "Budi", "Sari", "Dimas", "Lina")

dua_pertama = peserta_tetap[:2]
tiga_terakhir = peserta_tetap[-3:]

print(dua_pertama)
print(tiga_terakhir)
('Rina', 'Budi')
('Sari', 'Dimas', 'Lina')

Hasil slicing tuple selalu tuple baru — konsisten dengan perilaku slicing pada list yang menghasilkan list baru.

Immutability — Inti dari Tuple

Perbedaan paling fundamental antara tuple dan list terletak di sini. Coba ubah elemen tuple dan lihat apa yang terjadi:

# kuis.py — ini akan error
kode_kuis = ("KS", 2026, "Python Dasar")
kode_kuis[1] = 2027
TypeError: 'tuple' object does not support item assignment

Python langsung menolak. Tidak ada append(), tidak ada remove(), tidak ada sort() — semua method yang mengubah isi koleksi tidak tersedia di tuple. Ini bukan keterbatasan, tapi fitur. Ketika kamu menyimpan data di tuple, kamu membuat kontrak dengan dirimu sendiri: data ini tidak akan berubah.

Bandingkan perilaku ini dengan list:

OperasiListTuple
Akses elemen ([0])YaYa
Slicing ([1:3])YaYa
Ubah elemen ([0] = x)YaTypeError
append() / insert()YaTidak tersedia
remove() / pop()YaTidak tersedia
sort() / reverse()YaTidak tersedia

Iterasi Tuple

Karena tuple adalah sequence — sama seperti list dan range() — semua teknik iterasi yang sudah kita pelajari di BAB 11 berlaku:

# kuis.py — loop biasa
mata_pelajaran = ("Matematika", "Fisika", "Kimia", "Biologi")

for mapel in mata_pelajaran:
    print(f"- {mapel}")
- Matematika
- Fisika
- Kimia
- Biologi

enumerate() juga bekerja persis seperti pada list:

# kuis.py — dengan nomor urut
for nomor, mapel in enumerate(mata_pelajaran, start=1):
    print(f"{nomor}. {mapel}")
1. Matematika
2. Fisika
3. Kimia
4. Biologi

Tuple Packing dan Unpacking

Dua teknik ini mungkin terasa baru secara nama, tapi sebenarnya kamu sudah pernah melakukannya tanpa sadar.

Packing

Packing terjadi ketika beberapa nilai dikemas menjadi satu tuple:

# kuis.py — data peserta dikemas jadi tuple
nama = "Rina"
skor = 85
lulus = True

data_peserta = (nama, skor, lulus)
print(data_peserta)
('Rina', 85, True)

Tiga variabel terpisah dikemas menjadi satu tuple — itulah packing.

Unpacking

Kebalikannya, unpacking memecah tuple menjadi variabel-variabel terpisah:

# kuis.py — unpack data peserta
data_peserta = ("Rina", 85, True)

nama, skor, lulus = data_peserta

print(f"Nama:  {nama}")
print(f"Skor:  {skor}")
print(f"Lulus: {lulus}")
Nama:  Rina
Skor:  85
Lulus: True

Jumlah variabel di sisi kiri harus sama persis dengan jumlah elemen tuple. Jika tidak cocok, Python melempar ValueError.

Unpacking di Loop

Ingat enumerate() yang mengembalikan pasangan (index, nilai) di setiap iterasi? Itu sebenarnya tuple unpacking yang bekerja di balik layar. Kamu bisa memanfaatkan pola yang sama untuk data sendiri:

# kuis.py — unpack langsung di loop
hasil_kuis = [
    ("Rina",  85),
    ("Budi",  76),
    ("Sari",  91),
    ("Dimas", 68),
]

BATAS_LULUS = 70

for nama, skor in hasil_kuis:
    status = "lulus" if skor >= BATAS_LULUS else "tidak lulus"
    print(f"{nama}: {skor} ({status})")
Rina: 85 (lulus)
Budi: 76 (lulus)
Sari: 91 (lulus)
Dimas: 68 (tidak lulus)

Bandingkan ini dengan pendekatan nested list di BAB 14 yang menggunakan baris[0] dan baris[1] — tuple unpacking membuat kode jauh lebih ekspresif karena setiap nilai punya nama yang jelas.

Salah satu trik paling elegan dari tuple unpacking: menukar nilai dua variabel tanpa variabel perantara.

# kuis.py — tukar posisi peserta
pertama = "Budi"
kedua = "Rina"

print(f"Sebelum: {pertama}, {kedua}")

pertama, kedua = kedua, pertama

print(f"Sesudah: {pertama}, {kedua}")
Sebelum: Budi, Rina
Sesudah: Rina, Budi

Di bahasa lain, kamu biasanya butuh variabel temp untuk menampung sementara. Python tidak — karena sisi kanan (kedua, pertama) membentuk tuple baru terlebih dahulu, baru kemudian di-unpack ke sisi kiri.

Konversi Tuple

Fungsi tuple() mengubah tipe sequence lain menjadi tuple — kebalikan dari list() yang sudah kita pakai di BAB 14.

# kuis.py — konversi ke dan dari tuple
peserta_list = ["Rina", "Budi", "Sari"]
peserta_tuple = tuple(peserta_list)
print(peserta_tuple)

# konversi range ke tuple
nomor = tuple(range(1, 6))
print(nomor)

# konversi string ke tuple karakter
huruf = tuple("KUIS")
print(huruf)
('Rina', 'Budi', 'Sari')
(1, 2, 3, 4, 5)
('K', 'U', 'I', 'S')

Konversi balik ke list juga mudah — cukup bungkus dengan list():

# kuis.py
peserta_tuple = ("Rina", "Budi", "Sari")
peserta_list = list(peserta_tuple)
peserta_list.append("Fajar")
print(peserta_list)
['Rina', 'Budi', 'Sari', 'Fajar']

Pola ini sering dipakai ketika kamu menerima data sebagai tuple (dari fungsi atau sumber eksternal), tapi perlu memodifikasinya: konversi ke list, ubah seperlunya, lalu konversi kembali ke tuple jika dibutuhkan.

Nested Tuple

Seperti list, tuple juga bisa menyimpan tuple lain di dalamnya. Pola ini natural untuk data yang memiliki struktur tetap, seperti koordinat atau hasil kuis.

# kuis.py — setiap peserta punya nama dan 3 skor yang tidak berubah
hasil_final = (
    ("Rina",  85, 90, 78),
    ("Budi",  76, 68, 82),
    ("Sari",  91, 95, 88),
    ("Dimas", 68, 72, 65),
)

for peserta in hasil_final:
    nama = peserta[0]
    skor = peserta[1:]
    rata_rata = sum(skor) / len(skor)
    print(f"{nama}: {rata_rata:.1f}")
Rina: 84.3
Budi: 75.3
Sari: 91.3
Dimas: 68.3

Kode ini mirip sekali dengan versi nested list di BAB 14 — perbedaannya hanya di tipe datanya. Dan justru itu intinya: jika hasil_final adalah data yang sudah dikunci (misalnya hasil ujian resmi yang tidak boleh dikoreksi lagi), tuple memastikan tidak ada kode lain yang bisa mengubahnya secara tidak sengaja.

Tuple yang berisi tuple bersifat immutable di semua level — kamu tidak bisa mengubah elemen di tuple dalam maupun tuple luar. Tapi jika tuple berisi list, elemen di dalam list itu tetap bisa diubah karena list bersifat mutable. Ini adalah nuansa penting dari immutability di Python.

Keanggotaan dan Method Tuple

Operator in dan not in bekerja di tuple sama seperti di list:

# kuis.py — cek apakah mata pelajaran tersedia
mapel_tersedia = ("Matematika", "Fisika", "Kimia", "Biologi")

if "Fisika" in mapel_tersedia:
    print("Fisika tersedia sebagai mata pelajaran kuis")
Fisika tersedia sebagai mata pelajaran kuis

Tuple hanya punya dua method — karena semua method lain membutuhkan kemampuan mengubah data, yang tidak dimiliki tuple:

# kuis.py
skor = (85, 72, 91, 68, 77, 91, 85)

posisi = skor.index(91)
jumlah = skor.count(85)

print(f"Skor 91 pertama di index: {posisi}")
print(f"Skor 85 muncul {jumlah} kali")
Skor 91 pertama di index: 2
Skor 85 muncul 2 kali

index() dan count() — hanya dua itu. Bandingkan dengan list yang punya append(), insert(), remove(), pop(), sort(), reverse(), copy(), extend(), dan clear(). Kesederhanaan ini mencerminkan filosofi tuple: simpan data, jangan ubah.

Kapan Pakai Tuple, Kapan Pakai List

Pertanyaan ini pasti muncul setelah kamu melihat betapa miripnya tuple dan list. Pedoman sederhananya:

  • Tuple — untuk data yang secara konseptual tidak boleh berubah: koordinat, konfigurasi tetap, return value dari fungsi, kunci dictionary (nanti di bab mendatang).
  • List — untuk koleksi yang berubah-ubah: daftar peserta yang bisa bertambah/berkurang, skor yang bisa dikoreksi, antrian tugas yang diproses satu per satu.

Secara teknis, tuple juga sedikit lebih efisien dari segi memori dan kecepatan akses dibanding list. Tapi untuk skala program yang kita tulis sekarang, perbedaan performanya tidak terasa — pilih berdasarkan makna data, bukan performa.

Latihan

Tiga tantangan ini menggabungkan tuple dengan konsep dari bab-bab sebelumnya:

  1. Buat tuple koordinat berisi 5 pasangan (x, y) — misalnya titik-titik di peta. Gunakan loop for dengan unpacking untuk mencetak setiap pasangan dalam format "Titik: x=..., y=...". Kemudian, gunakan list comprehension untuk membuat list baru berisi hanya koordinat yang nilai x-nya positif (> 0).

  2. Kamu punya list of tuple nilai_siswa = [("Rina", 85), ("Budi", 72), ("Sari", 91), ("Dimas", 68)]. Tanpa mengubah data asli, gunakan tuple unpacking di loop untuk menemukan siswa dengan nilai tertinggi dan terendah. Cetak nama dan nilainya.

  3. Tulis program yang menerima dua variabel a = 10 dan b = 25, lalu tukar nilainya menggunakan tuple unpacking. Setelah ditukar, buat tuple hasil = (a, b, a + b) dan cetak setiap elemennya menggunakan unpacking ke tiga variabel terpisah.

Tuple melengkapi pemahaman kita tentang tipe data kolektif yang terurut di Python — list untuk data yang berubah, tuple untuk data yang tetap. Tapi ada satu hal menarik: baik list maupun tuple mengizinkan duplikasi data. Kamu bisa menyimpan "Rina" dua kali di list, atau skor 85 tiga kali di tuple, dan Python tidak akan protes. Bagaimana kalau kita butuh koleksi yang secara otomatis menjamin setiap elemennya unik — tanpa perlu menulis kode pengecekan manual?

Referensi

  1. 1Python Docs — Tuples and Sequences
  2. 2Python Docs — Built-in Types: tuple
  3. 3Real Python — Python Tuples: A Complete Overview