Nilai dalam program hampir tidak pernah berdiri diam. Saldo berkurang saat ada transaksi, skor bertambah saat pemain mencetak angka, dan pesan panjang terbentuk sedikit demi sedikit. Pola yang muncul berulang kali adalah “ambil nilai lama, olah, lalu simpan kembali” — dan operator assignment beserta bentuk ringkasnya (augmented assignment) dirancang persis untuk pola tersebut.
Penugasan Dasar #
Tanda = pada Python adalah operator penugasan, bukan pernyataan kesamaan matematika. Ketika interpreter Python membaca total = 5 + 3, interpreter mengevaluasi ekspresi di sisi kanan terlebih dahulu (8), lalu mengikat hasil tersebut ke nama total di sisi kiri. Sisi kanan selalu selesai dihitung sebelum sisi kiri menerima nilai.
Karena sisi kanan dievaluasi lebih dulu, pola x = x + 1 pun sah: Python membaca nilai x yang lama, menjumlahkannya dengan 1, baru menyimpan hasilnya kembali ke x. Sepanjang sebuah nama sudah menampung nilai, nama tersebut bisa diperbarui kapan saja.
Augmented Assignment #
Bentuk ringkas x = x <op> y dapat ditulis sebagai x <op>= y. Python menyediakan augmented assignment untuk hampir semua operator biner:
| Bentuk ringkas | Setara dengan |
|---|---|
x += y | x = x + y |
x -= y | x = x - y |
x *= y | x = x * y |
x /= y | x = x / y |
x //= y | x = x // y |
x %= y | x = x % y |
x **= y | x = x ** y |
Mari kita lihat operator tersebut memperbarui satu variabel secara bertahap:
total_belanja = 50000
total_belanja += 25000
print(total_belanja)
total_belanja -= 15000
print(total_belanja)
total_belanja *= 2
print(total_belanja)
total_belanja /= 4
print(total_belanja)Output yang Dihasilkan:
75000
60000
120000
30000.0Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 1 (
total_belanja = 50000): variabeltotal_belanjadibuat dengan nilai awal50000. - Baris 3 (
total_belanja += 25000): setara dengantotal_belanja = total_belanja + 25000; nilai baru menjadi75000. - Baris 6 (
total_belanja -= 15000): nilai dikurangi15000menjadi60000. - Baris 9 (
total_belanja *= 2): nilai dikalikan2menjadi120000. - Baris 12 (
total_belanja /= 4): nilai dibagi4. Karena/selalu menghasilkanfloat, hasilnya30000.0, bukan30000.
Bentuk ringkas lain bekerja serupa. Perhatikan hasil setiap operasi pada REPL berikut:
>>> porsi = 10
>>> porsi //= 3
>>> porsi
3
>>> sisa = 10
>>> sisa %= 3
>>> sisa
1
>>> kuadrat = 7
>>> kuadrat **= 2
>>> kuadrat
49Augmented assignment juga bekerja pada string untuk menempelkan potongan teks secara bertahap:
pesan = "Halo"
pesan += ", "
pesan += "Budi"
pesan += "!"
print(pesan)Output yang Dihasilkan:
Halo, Budi!Penugasan Ganda dan Swap #
Python memungkinkan beberapa nama menerima nilai dalam satu baris. Bentuk x, y = 10, 20 menempatkan 10 ke x dan 20 ke y sekaligus, dan pola yang sama bisa dipakai untuk menukar isi dua variabel tanpa variabel perantara:
x, y = 10, 20
print("Sebelum:", x, y)
x, y = y, x
print("Sesudah:", x, y)Output yang Dihasilkan:
Sebelum: 10 20
Sesudah: 20 10Pada baris x, y = y, x, interpreter Python lebih dulu mengevalusi sisi kanan menjadi pasangan nilai 20, 10 — seperti tuple (20, 10) — lalu membongkarnya ke nama di sisi kiri. Karena kedua nilai “sudah siap” sebelum penugasan terjadi, nilai lama tidak perlu disimpan ke tempat lain.
Penugasan juga bisa berantai ke beberapa nama sekaligus: a = b = 0 memberi nilai 0 ke a dan b. Perlu dicatat bahwa kedua nama merujuk ke object angka yang sama; model rujukan ini kita bedah pada Chapter Memahami Object dan Reference.
Catatan tentang Walrus Operator #
Sejak Python 3.8 terdapat operator := (walrus operator) yang memberi nilai di dalam ekspresi, bukan sebagai statement tersendiri:
>>> print(panjang := len("belajar"))
7
>>> panjang
7Operator := menugaskan len("belajar") ke panjang sekaligus mengembalikan nilainya sehingga print() langsung menerima 7. Kasus pemakaian nyatanya — misalnya di dalam kondisi loop — dibahas tuntas pada Chapter Walrus Operator := di Section Modern Python.