Di banyak bahasa pemrograman, sebuah variabel menikah dengan satu tipe data sejak dideklarasikan dan tidak boleh berpindah ke tipe lain. Python memilih jalan sebaliknya: variabel di Python tidak memiliki tipe — yang bertipe adalah object yang ditunjuknya. Karakteristik ini disebut dynamic typing, dan memahaminya menjelaskan mengapa kode Python begitu ringkas sekaligus mengapa galat tipe kadang baru muncul di tengah jalan.
Variabel Boleh Berganti Tipe #
Karena assignment hanya mengikatkan nama ke object (seperti yang kita pelajari pada Chapter Memahami Object dan Reference), nama yang sama boleh dipindahkan dari object bertipe satu ke object bertipe lain kapan saja:
data = 42
print(type(data))
data = "empat puluh dua"
print(type(data))
data = 3.14
print(type(data))Output yang Dihasilkan:
<class 'int'>
<class 'str'>
<class 'float'>Mari kita telaah jalannya program:
- Baris 1 (
data = 42): namadatadiikat ke objectintbernilai42. - Baris 3 (
data = "empat puluh dua"): namadatadipindahkan ke objectstryang sama sekali baru — objectintyang lama tidak diubah, melainkan ditinggalkan. - Baris 5 (
data = 3.14): namadataberpindah lagi ke objectfloat.
Penting dicatat: ini bukan “mengubah tipe nilai” — object 42 tidak pernah berubah menjadi string. Yang terjadi hanyalah pengikatan ulang nama ke object baru yang bertipe berbeda.
Dynamic versus Static Typing #
Perbedaan mendasar antara kedua aliran ini terletak pada waktu pemeriksaan tipe:
| Aspek | Dynamic Typing (Python) | Static Typing (Java, C, Rust) |
|---|---|---|
| Pemeriksaan tipe | saat program berjalan, baris demi baris | sebelum program berjalan, oleh compiler |
| Deklarasi tipe variabel | tidak diperlukan | wajib saat deklarasi |
| Variabel berganti tipe | boleh, lewat assignment baru | ditolak compiler |
| Galat tipe terdeteksi | saat baris bermasalah dieksekusi | sejak proses kompilasi |
| Contoh bahasa | Python, JavaScript, Ruby | Java, C, C++, Rust |
Kedua kubu membayar harga yang berbeda. Static typing menangkap galat tipe lebih awal dan membantu editor melengkapi kode, tetapi menuntut upacara deklarasi di setiap baris. Dynamic typing membuat kode pendek dan cepat ditulis, tetapi galat seperti menjumlahkan string dengan angka baru terlihat saat baris tersebut benar-benar dieksekusi — mungkin saat program sudah dipakai pengguna.
Python tidak membiarkan kelemahan ini begitu saja. Sejak Python 3.5 tersedia type hints — anotasi tipe opsional yang bisa diperiksa alat seperti mypy tanpa mengubah perilaku program saat berjalan. Kita akan mempelajarinya pada Section Type Hints dan Static Analysis.
Sepintas tentang Duck Typing #
Dari dynamic typing lahir filosofi khas Python bernama duck typing, dari ungkapan: “jika berjalan seperti bebek dan bersuara seperti bebek, itu bebek”. Artinya: kode Python lebih peduli pada perilaku object daripada identitas tipenya. Operator yang sama bekerja pada tipe apa pun yang mendukung perilaku tersebut:
print(10 + 5)
print("10" + "5")Output yang Dihasilkan:
15
105Operator + menghasilkan 15 untuk angka karena tipe int mengimplementasikan penjumlahan, dan menghasilkan "105" untuk string karena tipe str mengimplementasikan penggabungan. Interpreter Python tidak bertanya “tipe ini apa dulu?”, melainkan langsung memakai perilaku yang tersedia; jika perilakunya tidak ada, barulah TypeError muncul.
Inilah alasan mengapa isinstance() pada Chapter Memeriksa Tipe Data cukup memeriksa keanggotaan tipe secukupnya, dan mengapa fungsi bawaan seperti len() bekerja untuk string, list, maupun dictionary sekaligus. Mekanisme di balik perilaku-perilaku ini — special method seperti __add__ — akan terbuka penuh saat kita belajar class pada Section Object-Oriented Programming.