Variabel dan pengetikan dinamis

Aturan variabel dan pengetikan dinamis Python, termasuk intipan id() dan type().

Daftar isi

Variabel pada Python bukan kotak bertipe tetap sebagaimana pada bahasa yang mewajibkan deklarasi. Variabel adalah nama yang terikat ke sebuah objek, dan ikatan itu dapat diganti kapan saja. Topik ini membahas cara kerja penugasan, konsekuensi pengetikan dinamis (dynamic typing), aturan penamaan yang sah, serta pengenalan identitas objek melalui fungsi id(). Setelah topik ini dibaca, penulisan variabel yang benar dan penamaan yang rapi dapat diterapkan sejak baris pertama program.

Penugasan mengikat nama ke objek#

Tanda sama dengan dalam Python bukan persamaan matematika, melainkan operator penugasan (assignment). Penugasan tidak menyalin nilai ke dalam variabel, tetapi mengikat nama di sebelah kiri ke objek di sebelah kanan. Objek angka 7 dan nama yang menunjuknya adalah dua hal yang berbeda: nama menunjuk ke objek, bukan sebaliknya.

Tidak ada deklarasi tipe. Nama tercipta pada saat pertama kali diberi nilai, dan penugasan berikutnya mengganti ikatan lama dengan yang baru. Nilai lama tidak ikut berubah karena yang diganti hanyalah ikatan namanya, bukan objeknya.

python
judul = "Almanak kecil"
jumlah_halaman = 24
print(judul, jumlah_halaman)

jumlah_halaman = jumlah_halaman + 8
print(jumlah_halaman)
text Keluaran
Almanak kecil 24
32

Baris jumlah_halaman = jumlah_halaman + 8 diproses mulai dari sisi kanan tanda sama dengan. Ekspresi di sebelah kanan dihitung lebih dahulu menjadi 32, lalu nama jumlah_halaman diikat ulang ke objek baru itu. Ikatan semacam ini berlaku sama untuk semua tipe, baik angka, string, maupun tipe lain yang ditemui nanti.

Pengetikan dinamis#

Python menentukan tipe dari objeknya, bukan dari namanya. Satu nama yang sama boleh mengikat objek int pada satu saat dan objek string pada saat berikutnya. Sifat ini disebut pengetikan dinamis, dan fungsi type() digunakan untuk memeriksa tipe yang sedang terikat.

python
nilai = 24
print(nilai, type(nilai))
nilai = "dua puluh empat"
print(nilai, type(nilai))
text Keluaran
24 <class 'int'>
dua puluh empat <class 'str'>

Tipe berpindah bersama penggantian objeknya, sementara namanya tetap. Penggantian tipe seperti ini berguna untuk memahami model bahasanya, tetapi dalam program nyata satu nama sebaiknya dipertahankan untuk satu jenis makna agar kode tetap mudah dibaca.

Aturan penamaan yang sah#

Nama variabel hanya boleh terdiri atas huruf, angka, dan garis bawah, serta tidak boleh diawali angka. Python membedakan huruf besar dan kecil, sehingga Nilai, nilai, dan NILAI adalah tiga nama yang berbeda. Sejumlah kata dipakai oleh sintaks Python untuk keperluannya sendiri dan tidak dapat dijadikan nama, misalnya class, if, dan for.

NamaStatusAlasan
nilai_ujiansahkombinasi huruf kecil dan garis bawah
nilai2sahangka boleh muncul setelah karakter pertama
2nilaitidak sahdiawali angka
nilai-ujiantidak sahtanda hubung dibaca sebagai operator pengurangan
classtidak sahkata kunci (keyword) milik sintaks Python

Daftar kata kunci dapat diperiksa melalui modul keyword tanpa harus menghafalnya lebih dahulu.

python
import keyword
print(keyword.iskeyword("class"))
print(keyword.iskeyword("Class"))
print(keyword.iskeyword("jumlah"))
text Keluaran
True
False
False

Fungsi iskeyword() mengembalikan True untuk kata kunci. Hasil baris kedua sekaligus menunjukkan bahwa pembedaan huruf besar dan kecil berlaku juga pada kata kunci: class ditolak, sedangkan Class tidak termasuk kata kunci. Sebagai konvensi, nama variabel ditulis dengan huruf kecil dan garis bawah, gaya yang dikenal sebagai snake_case, seperti nilai_ujian pada tabel di atas.

python
# tidak-dijalankan: keempat baris berikut memicu error sintaks
2nilai = 80
nilai ujian = 80
nilai-ujian = 80
class = "ujian"

Identitas objek dan fungsi id()#

Setiap objek yang berada di memori memiliki identitas, yaitu penanda yang membedakannya dari objek lain. Fungsi id() mengembalikan identitas tersebut berupa sebuah angka. Angkanya dijamin unik selama masa hidup objek, tetapi nilainya berbeda pada setiap proses eksekusi, sehingga tutorial tidak menampilkan angkanya dan cukup membandingkannya.

Operator is membandingkan identitas dua nama: hasilnya True apabila keduanya mengikat objek yang sama. Membandingkan hasil id() dua nama dengan == memberikan kesimpulan yang setara. Perbedaan dengan perbandingan nilai adalah sebagai berikut: == membandingkan isi objek, sedangkan is membandingkan ikatannya.

python
a = 7
b = a
print(a is b)
print(id(a) == id(b))
a = "tujuh"
print(a is b)
print(b)
text Keluaran
True
True
False
7

Awalnya a dan b mengikat objek yang sama, sehingga is dan perbandingan id() sama-sama menghasilkan True. Setelah a diikat ulang ke string tujuh, ikatan b tidak tersentuh dan tetap menunjuk objek 7, sehingga is menghasilkan False. Perilaku ini adalah inti model data Python: penugasan tidak pernah mengubah objek lama, melainkan hanya memindahkan ikatan nama.

Kesalahan umum#

Dua error paling lazim pada variabel sama-sama berkait dengan nama, dan keduanya memicu NameError. Penyebabnya sama, yaitu nama yang dibaca interpreter belum terikat ke nilai apa pun.

  • Menggunakan nama sebelum diberi nilai. Interpreter mengeksekusi berkas dari atas ke bawah, sehingga penugasan wajib mendahului pemakaiannya.
  • Salah kapital pada nama. Karena Nilai dan nilai berbeda, satu huruf kapital yang keliru langsung diperlakukan sebagai nama lain yang belum terdefinisi.
python
nilai = 10
try:
    print(data_piket)
except NameError as e:
    print(type(e).__name__)
    print(str(e))
text Keluaran
NameError
name 'data_piket' is not defined

Pesan error menyebut nama yang tidak dikenal secara eksplisit, sehingga letak perbaikannya mudah ditemukan. Periksa ejaan dan huruf kapitalnya, lalu pastikan penugasan untuk nama itu sudah ditulis sebelum baris yang memakainya.

Ringkasan#

  • Penugasan mengikat nama ke objek tanpa deklarasi, dan ikatan dapat diganti kapan saja tanpa memengaruhi objek lama.
  • Tipe melekat pada objek, sehingga satu nama boleh mengikat objek dengan tipe berbeda dari waktu ke waktu, sesuai sifat pengetikan dinamis.
  • Nama hanya boleh memuat huruf, angka, dan garis bawah, tidak diawali angka, dan tidak boleh berupa kata kunci.
  • id() mengembalikan identitas objek, is membandingkan identitas, sedangkan == membandingkan nilai.

Referensi#