Hati-hati Jebakan: Pass By Reference vs Pass By Value Dalam Python


Teknisnya, pada saat kita mencreate suatu variabel atau objek (string, integer, array dll), program kita akan meminta pada Operating System (OS) untuk menyisihkan sebagian ruang Random Access Memori (RAM) nya yang akan digunakan untuk menampung objek tersebut. Jika OS mengabulkan permintaan tersebut, maka OS akan memberikan suatu alamat memori yang bisa digunakan oleh program yang kita buat untuk menampung variabel yang kita buat tersebut. Di program yang kita buat, variabel tersebut pastinya punya nama variabel

dan nama tersebutlah (objek1 dan objek2) yang menjadi label yang bisa kita panggil kapan saja ketika kita membutuhkannya daripada harus memanggil alamat memori aslinya yang tentunya pasti akan sangat random.

Yang dimaksud dengan passing di sini adalah dimana kita menetapkan nilai suatu variabel berdasarkan kepada variabel yang sudah ada sebelumnya.
Pemrogram Python akan sangat jarang memusingkan masalah passing ini, berbeda dengan pemrogram C/C++ yang sering berkutat dengan memori dan pointer. Ini bisa dimaklumi karena Python adalah bahasa yang sangat high level dimana para penggunanya diharapkan tidak perlu memusingkan hal-hal low level seperti itu. Tapi akan ada beberapa kasus yang akan membuat kita pusing karena program berjalan tidak seperti yang kita harapkan karena kita gagal memahami masalah ini. Untuk itu, berikut pembahasan mengenai 2 jenis passing tersebut.

Pass By Value

Pass by value adalah jenis passing yang pada sebagian besar kasus kebanyakan kita "harapkan" terjadi. Pass By Value adalah passing dimana kita mengambil replika nilai dari variabel lain untuk menjadi nilai dari variabel yang kita inginkan. Sehingga pada kasus pass by value, program akan meminta ruang RAM sebanyak 2x (pertama untuk variabel awal dan yang kedua untuk variabel yang ingin kita tetapkan nilainya melalui passing ini). Pada kasus pass by value, anggap variabel awal bernama objek1 dan variabel yang kedua objek2, jika kita mengubah nilai dari objek1 maka nilai objek2 tidak akan berubah. Dengan kata lain kedua variabel ini saling independen.

Pass By Reference

Kebanyakan script yang kita buat tidak berjalan seperti yang kita inginkan karena kita gagal memahami passing jenis ini. Pass by reference adalah passing dimana nilai dari variabel kedua kita yang ingin ditetapkan nilainya merefer dari alamat memori variabel pertama. Ini membuat alamat memori variabel pertama kita, literally punya 2 label (2 nama variabel merujuk ke alamat memori yang sama). Efeknya, ketika kita mengubah nilai pada variabel pertama, variabel kedua akan berubah juga nilainya menyamai dengan variabel pertama. Begitu juga sebaliknya jika mengubah nilai variabel kedua, variabel pertama secara otomatis akan berubah juga nilainya.


Ilustrasi perbedaan pass by value dan pass by reference

Walaupun terkadang counter intuitive, pass by reference tetap punya ketungan dibanding saudaranya. Passing jenis ini lebih cepat prosesnya karena hanya merefer alamat memori, tidak perlu meminta ruang memori RAM tambahan. Keuntungan ini akan lebih terasa ketika objek yang di create butuh memori lebih besar (objek-objek advance berdasarkan library tambahan dan bukan bawaan Python seperti integer, string dll). Selain lebih cepat, pass by reference sudah jelas akan lebih ringan saat di running programnya karena tidak meminta ruang RAM tambahan.

Pada python, list atau array berpotensi terjadi pass by reference sedangkan string, integer, float tidak.



Sekian pembahasan kali ini. Pada kebanyakan kasus kita memang tidak perlu memusingkan ini tapi pada beberapa kasus ini perlu diperhatikan dan akan sangat sulit debugging scriptnya jika kita tidak tahu mengenai ini. Sekian.

referensi:
https://cseducators.stackexchange.com/questions/583/what-is-a-good-analogy-for-pass-by-value-vs-by-reference, di akses pada 20 Juni 2018

Komentar