Mutability Concept and Parameter Passing

Mutability

Dalam Python, setiap tipe data diperlakukan sama dalam hal penyimpanan apabila diberikan ke suatu variabel. Data akan disimpan pada suatu blok memori terpisah dari variabelnya dan variabel hanya akan menyimpan sebuah alamat ke blok memori di mana data tersebut disimpan. Hal ini berbeda dengan bahasa pemrograman lain, seperti Java, di mana tipe data tertentu disimpan di blok memori yang sama dengan variabelnya.

Sebagai contoh, anggaplah ada dua variabel a dan b seperti berikut:

a = 2
b = 4

Variabel a dan b masing-masing hanya menyimpan alamat dari blok memori yang menampung data angka yang dibuat. Pada grafik di atas, alamat direpresentasikan dengan tanda panah yang menunjuk ke blok memori yang dimaksud. Lalu, misalnya kita ingin membuat nilai a menjadi sama dengan nilai b sebagai berikut:

a = b

Yang terjadi adalah alamat yang disimpan oleh a akan diubah menjadi alamat yang disimpan oleh b sehingga akan menunjuk ke objek angka yang sama.

Namun, sebagai kompromi terhadap tidak adanya perbedaan konsep penyimpanan data dalam Python, Python menganut sistem mutability. Sistem ini menentukan apakah suatu objek bisa diubah di tempat atau tidak. Tipe-tipe data yang ada di Python terbagi menjadi dua jenis berdasarkan sifat mutability-nya:

  1. Immutable: Tipe data yang tidak dapat diubah di tempat, sehingga perubahan yang dikenakan padanya akan menghasilkan objek baru dan data aslinya tidak berubah. Contoh: Integer, Float, Tuple, String.
  2. Mutable: Tipe data yang dapat diubah di tempat, sehingga perubahan tertentu yang dikenakan padanya akan mengubah objek itu sendiri. Contoh: List.

Misalnya, variabel a dan b tadi menunjuk ke objek Integer 4 yang sama. Kemudian, kita mengubah a dengan operasi matematika sebagai berikut:

a += 2

Meskipun a dan b menunjuk ke objek yang sama, karena Integer bersifat immutable, yang terjadi adalah akan terbentuk objek baru yang merupakan hasil dari penjumlahan nilai a sebelumnya (2) dengan 2:

Pada grafik di atas, terlihat bahwa nilai b tidak akan berubah meskipun objek yang ditunjuk pada awalnya sama. Lain halnya dengan perubahan yang dikenakan pada tipe data mutable:

a = ["1"]
b = a
a.append("2")

Sebelum dikenakan append:

Setelah dikenakan append:

Untuk tipe data mutable, perubahan yang dikenakan tidak akan membuat objek baru, namun akan mengubah objeknya itu sendiri. Sehingga, meskipun kita memodifikasi variabel a saja, variabel b juga turut berubah.

Namun, apabila kita memberikan suatu objek baru ke suatu variabel, keterkaitan antar-variabelnya akan terputus meskipun tipe datanya mutable, misalnya:

a = ["1"]
b = a
a = ["2"]

Sebelum diberikan objek baru:

Setelah diberikan objek baru:

Parameter Passing

Pada setiap pemanggilan fungsi yang berkaitan dengan argumen-argumen, konsep mutability tetap berlaku. Amatilah contoh di bawah ini:

def sebuah_fungsi(argumen):
print("argumen =",argumen)
random_string = "Foo"
sebuah_fungsi(random_string)

Hasil:

argumen = Foo

Dengan menjadikan random_string sebagai argumen sebuah_fungsi, maka yang terjadi adalah variabel argumen akan diberikan alamat dari blok memori yang disimpan oleh random_string, dalam hal ini adalah objek String "Foo". Perlu dicatat bahwa variabel yang merupakan bagian dari sebuah fungsi, baik yang dijadikan argumen maupun variabel-variabel yang dibuat di dalam fungsi, hanya hidup di dalam fungsi. Sehingga, variabel-variabel tersebut tidak dapat dipanggil dari luar fungsi. Contoh:

def a_function(argumen):
an_item = argumen
a_function("WOW")
print(argumen)
print(an_item)

Hasil:

NameError: name 'argumen' is not defined

Further Learning:

Konsep variabel dalam fungsi ini merupakan bagian dari pembahasan namespace yang merupakan materi Dasar-Dasar Pemrograman 1 dengan nama bab yang sama (Namespaces).

Dengan menerapkan konsep mutability dalam parameter passing, jika data tersebut bersifat immutable, maka perubahannya tidak akan sampai ke luar fungsi. Contoh:

def modify_number(num):
num += 3
print("num =",num)
my_num = 5
modify_number(my_num)
print("my_num =",my_num)

Hasil:

num = 8
my_num = 5

Sebaliknya, jika data bersifat mutable, maka perubahan akan dikenakan baik di dalam maupun di luar fungsi. Contoh:

def modify_list(lst):
lst.append("3")
print("lst =",lst)
my_lst = ["1"]
modify_list(my_lst)
print("my_lst =",my_lst)

Hasil:

lst = ['1', '3']
my_lst = ['1', '3']