Cara menggunakan python objects in memory

Pernah suatu hari anbi mendebug suatu program yang dibuat dari bahasa Python. Disitu, anbi sedang menemukan ada suatu variabel yang sangat aneh.

Variabel tersebut selalu terdefinisi padahal didefinisikan diawal program. Tetapi pada pertengahan program, variabel tersebut berubah - ubah nilainya. Padahal tidak ada satupun kode yang mengubah variabel tersebut.

Anbi mendefinisikan variabel tersebut dengan nilai variabel lain, yaitu seperti ini :

origin_price = price

Anbi berniat membuat rekaman nilai awal (

>>> a = 10
>>> b = "ini string"
>>> id(a)
1788979264
>>> id(b)
1788979424
>>> id(True)
1788854592
9) untuk nilai yang ada di variabel
a = 10
b = a
print('nilai b : ', b)

a = a + 30
print('nilai b : ', b)
0. Sehingga ketika
a = 10
b = a
print('nilai b : ', b)

a = a + 30
print('nilai b : ', b)
0 dikalkulasi ditengah program, anbi tetap memiliki nilai awal yang belum di kalkulasi (
>>> a = 10
>>> b = "ini string"
>>> id(a)
1788979264
>>> id(b)
1788979424
>>> id(True)
1788854592
9).

“Nah, menurut kawan - kawan semua? dimana letak kesalahan anbi?"


Alamat Sebuah Variabel


Oke, yang belum menemukan letak kesalahan anbi diatas, mari kita bahas disini.

Didalam Python, semuanya adalah object. Mulai dari String, number, list, dictionary, class ,function,

a = 10
b = a
print('nilai b : ', b)

a = a + 30
print('nilai b : ', b)
3,
a = 10
b = a
print('nilai b : ', b)

a = a + 30
print('nilai b : ', b)
4 dan
a = 10
b = a
print('nilai b : ', b)

a = a + 30
print('nilai b : ', b)
5 itu semua adalah object. Python akan menempatkan masing - masing nilai object tersebut kedalam sebuah memory address.

Oke, sebagai contoh anbi buat 2 variabel dan kita lihat masing - masing memory address dari variabel tersebut menggunakan fungsi

a = 10
b = a
print('nilai b : ', b)

a = a + 30
print('nilai b : ', b)
6.

>>> a = 10
>>> b = "ini string"
>>> id(a)
1788979264
>>> id(b)
1788979424
>>> id(True)
1788854592

Bisa kita lihat Masing - masing nilai dari variabel diatas memiliki alamat memori (

a = 10
b = a
print('nilai b : ', b)

a = a + 30
print('nilai b : ', b)
7) sendiri.

Tetapi jangan salah, setiap alamat memory mewakili nilai, bukan variabel. Sehingga ketika membuat variabel, nilai pada variabel akan ditempatkan pada sebuah alamat memori, dan variabel hanya mereferensikan alamat memori.

Maksudnya bagaimana? Oke kita punya kasus seperti ini :

a = 10
b = a
print('nilai b : ', b)

a = a + 30
print('nilai b : ', b)

nilai b : 10
nilai b : 40

Kenapa variabel

a = 10
b = a
print('nilai b : ', b)

a = a + 30
print('nilai b : ', b)
8 tiba - tiba berubah? padahal kita tidak melakukan operasi apapun pada variabel
a = 10
b = a
print('nilai b : ', b)

a = a + 30
print('nilai b : ', b)
8. Padahal yang kita operasikan variabel
nilai b : 10
nilai b : 40
0 kenapa efeknya bisa sampai ke
a = 10
b = a
print('nilai b : ', b)

a = a + 30
print('nilai b : ', b)
8?

Coba kita lihat alamat memori masing - masing variabel :

a = 10
b = a

print(id(a))
print(id(b))

1788979264
1788979264

Fungsi

a = 10
b = a
print('nilai b : ', b)

a = a + 30
print('nilai b : ', b)
6 digunakan untuk melihat alamat memori pada nilai tersebut.

Ternyata kedua variabel tersebut memiliki alamat memori yang sama. Hal ini sama seperti saat kita mendefinisikan dua variabel dengan nilai yang sama dalam satu baris.

a = b = 10

Yak, seperti itu kira - kira hal yang kita alami.

Lalu bagaimana jika kita buat variabel

a = 10
b = a
print('nilai b : ', b)

a = a + 30
print('nilai b : ', b)
8 dengan nilai yang berbeda dari variabel
nilai b : 10
nilai b : 40
0.

a = 10
b = 20

print(id(a))
print(id(b))

1788979264
1788979424

Kalian lihat, alamat memori mereka berbeda. Inilah maksud dari “alamat memori mewakili nilai”. Dan tugas dari variabel adalah mereferensikan alamat memori tersebut.

Dalam Python hal ini disebut dengan “Reference”

Cara menggunakan python objects in memory
Variaebl Dan Alamat Memori

Lalu bagaimana dengan variabel bernilai

nilai b : 10
nilai b : 40
5 atau
nilai b : 10
nilai b : 40
6? Apakah mereka juga membagikan alamat memori yang sama?

Kita ambil kasus dengan contoh seperti ini :

first_list = [1,2,3,4]
second_list = first_list

print(id(first_list))
print(id(second_list))

second_list.append(5)

print(first_list)
print(second_list)

>>> a = 10
>>> b = "ini string"
>>> id(a)
1788979264
>>> id(b)
1788979424
>>> id(True)
1788854592
0

Bisa kita lihat dari output diatas, kedua variabel tersebut memiliki alamat memori yang sama. Sehingga ketika terdapat penambahan data di

nilai b : 10
nilai b : 40
7, maka variabel
nilai b : 10
nilai b : 40
8 juga ikut berubah.


Membuat Alamat Baru, Dengan Nilai Sama


Dari penjelasan sebelumnya kita bisa menyimpulkan bahwa dalam Python, setiap nilai memiliki alamatnya masing - masing.

Lalu bagaimana cara kita membuat nilai yang sama, dari dua variabel yang berbeda tanpa membagi memori address yang sama?. Mudah, kita hanya perlu fungsi

nilai b : 10
nilai b : 40
9.

>>> a = 10
>>> b = "ini string"
>>> id(a)
1788979264
>>> id(b)
1788979424
>>> id(True)
1788854592
1

>>> a = 10
>>> b = "ini string"
>>> id(a)
1788979264
>>> id(b)
1788979424
>>> id(True)
1788854592
2

Fungsi

nilai b : 10
nilai b : 40
9 digunakan untuk menduplikasi nilai dan membuatkan alamat memori tersendiri untuk nilai tersebut. Dengan ini variabel - variabel tersebut akan menjadi independen.

>>> a = 10
>>> b = "ini string"
>>> id(a)
1788979264
>>> id(b)
1788979424
>>> id(True)
1788854592
3

>>> a = 10
>>> b = "ini string"
>>> id(a)
1788979264
>>> id(b)
1788979424
>>> id(True)
1788854592
4

Sekarang kita bisa menduplikasi nilai variabel tanpa takut akan mengubah nilai pada variabel lain.


Sama, Tapi Tidak Sama


Sekarang mari coba kita telaah lebih dalam lagi, “Apakah variabel - variabel yang kita buat untuk mereferensikan alamat memori sebuah nilai itu sama?" Disinilah operator perbandingan,

a = 10
b = a

print(id(a))
print(id(b))
1 akan membuktikan segalanya.

Dalam perbandingan, double equals (

a = 10
b = a

print(id(a))
print(id(b))
2) digunakan untuk membandingkan dua objek dan melihat apakah mereka itu objek yang sama atau tidak.

Tetapi berbeda dengan

a = 10
b = a

print(id(a))
print(id(b))
1, operator ini akan membandingkan dua objek dan melihat apakah mereka itu objek yang sama, serta melihat apakah mereka memiliki alamat memori yang sama atau tidak.

Contoh :

>>> a = 10
>>> b = "ini string"
>>> id(a)
1788979264
>>> id(b)
1788979424
>>> id(True)
1788854592
5

>>> a = 10
>>> b = "ini string"
>>> id(a)
1788979264
>>> id(b)
1788979424
>>> id(True)
1788854592
6

Keduanya merupakan objek yang sama dengan alamat memori yang sama. Coba kita bandingkan dengan nilai

a = 10
b = a

print(id(a))
print(id(b))
4 yang jelas - jelas memiliki nilai yang sama.

>>> a = 10
>>> b = "ini string"
>>> id(a)
1788979264
>>> id(b)
1788979424
>>> id(True)
1788854592
7

>>> a = 10
>>> b = "ini string"
>>> id(a)
1788979264
>>> id(b)
1788979424
>>> id(True)
1788854592
8

Walaupun mereka memiliki nilai yang sama, akan tetapi operator

a = 10
b = a

print(id(a))
print(id(b))
1 tetap menyebut itu berbeda. Dikarenakan alamat memori mereka yang berbeda.

. . .

Itulah singkat cerita tentang alamat memori yang terjadi pada saat kita membuat variabel. Lalu apakah pembahasannya berhenti disini? tidak dong nanti anbi bahas lebih jauh lagi tentang Python Reference