For AI agents: use /llms.txt for the Nakafa content index.
Dalam Python, list merupakan struktur data yang dapat diubah setelah dibuat. Mari kita pahami bagaimana perilaku list ketika kita melakukan operasi tertentu.
Ketika sebuah list di-assign ke variabel, variabel itu merujuk ke objek list tersebut. Assignment tidak menyalin list. Karena itu, variabel atau container lain dapat merujuk ke objek yang sama persis.
# Membuat list dan memberikan referensi
list1 = [0, 1, 2]
list2 = ['a', list1, True]
print(list2) # ['a', [0, 1, 2], True]
# Mengubah elemen dalam list1
list1[1] = [3, 4, 5]
print(list2) # ['a', [0, [3, 4, 5], 2], True]Perhatikan bagaimana perubahan pada list1 juga mempengaruhi list2. Ini terjadi karena list2 tidak menyimpan salinan list1, melainkan referensi ke objek list yang sama di memori.
Full slice membuat list luar baru yang berisi referensi ke elemen-elemen yang sama. Hasilnya adalah shallow copy. Mengganti elemen luar tidak memengaruhi list asal, tetapi elemen mutable yang bertingkat tetap dipakai bersama.
# Operasi slice menciptakan list baru
list1 = [0, 1, 2]
list2 = list1[:] # Mengambil semua elemen dengan slice
print(id(list1)) # Contoh: 3104
print(id(list2)) # Contoh: 8864 (berbeda dari list1)
# Mengubah elemen di list2 tidak mempengaruhi list1
list2[0] = 'x'
print(list1) # [0, 1, 2] (tidak berubah)
print(list2) # ['x', 1, 2]
# Elemen mutable bertingkat tetap dipakai bersama oleh shallow copy
nested1 = [[1], [2]]
nested2 = nested1[:]
nested2[0].append(3)
print(nested1) # [[1, 3], [2]]Setiap objek dalam Python memiliki tiga karakteristik penting yang membedakannya dari objek lain.
Identitas menjawab apakah dua referensi menunjuk ke objek yang sama. id() mengembalikan integer yang unik di antara objek-objek yang hidup bersamaan, sedangkan is membandingkan identitas secara langsung. Bahasa Python tidak menjamin bahwa integer tersebut merupakan alamat memori fisik.
a = 300
print(a) # 300
print(type(a)) # <class 'int'>
print(id(a)) # 10120
b = a # b mereferensi objek yang sama dengan a
print(id(b)) # 10120 (sama dengan a)
a = a + 1 # Membuat objek baru
print(id(a)) # 10492 (berbeda dari sebelumnya)Gunakan is ketika yang ditanyakan adalah identitas objek, terutama pada pemeriksaan seperti value is None. Gunakan == ketika kamu membandingkan nilai. Cache interpreter dan constant folding dapat membuat nilai immutable yang sama berbagi identitas, tetapi logika aplikasi tidak boleh bergantung pada detail implementasi tersebut.
a = [1, 2]
b = a
c = [1, 2]
print(a is b) # True: objek yang sama
print(a == b) # True: nilai yang sama
print(a is c) # False: objek berbeda
print(a == c) # True: nilainya setaraPython mengklasifikasikan objek berdasarkan kemampuannya untuk diubah setelah dibuat.
Objek immutable tidak dapat diubah setelah dibuat. Setiap operasi yang tampak mengubah objek sebenarnya menciptakan objek baru.
# Integer adalah immutable
a = 300
print(id(a)) # 10120
a = a + 1 # Membuat objek baru
print(id(a)) # 10492 (berbeda)
# String juga immutable
str_var = 'hello'
print(id(str_var)) # 75568
# Mencoba mengubah string akan menghasilkan error
# str_var[1] = 'a' # TypeErrorTipe immutable yang umum dalam Python meliputi:
bool (boolean)int (integer)float (floating point)complex (bilangan kompleks)str (string)tuple (tuple)Urutan referensi milik tuple tidak dapat diubah, tetapi objek yang dirujuk tuple masih dapat bersifat mutable.
Objek mutable dapat diubah setelah dibuat tanpa menciptakan objek baru. Identitas objek tetap sama meskipun nilainya berubah.
# List adalah mutable
list_var = [0, 1, 2]
original_id = id(list_var)
# Mengubah elemen mempertahankan identitas list
list_var[0] = 9
print(id(list_var) == original_id) # True
# Assignment mengikat variabel ke objek baru
list_var = [0, 0, 0]
print(id(list_var) == original_id) # False
# Slice assignment memodifikasi list saat ini secara in-place
current_id = id(list_var)
list_var[:] = ['a', 'b', 'c']
print(id(list_var) == current_id) # TrueTipe mutable yang umum dalam Python meliputi:
list (list)dict (dictionary)set (set)Penting untuk membedakan antara assignment (pemberian nilai baru) dan modifikasi in-place.
list1 = [0, 1, 2]
list2 = list1 # Kedua variabel mereferensi objek yang sama
print(id(list1)) # 700
print(id(list2)) # 700 (sama)
# Modifikasi in-place mempengaruhi kedua variabel
list1[1] = 'x'
print(list1) # [0, 'x', 2]
print(list2) # [0, 'x', 2] (ikut berubah)
# Assignment membuat referensi baru
list1 = [1, 2, 3]
print(list1) # [1, 2, 3]
print(list2) # [0, 'x', 2] (tidak berubah)Mutabilitas menentukan apakah suatu operasi mengubah objek yang sudah ada atau mengikat ulang nama ke objek lain. Immutability menghilangkan satu sumber bug pada shared state, tetapi tidak otomatis membuat program thread-safe. Objek mutable yang dirujuk, operasi majemuk, dan resource eksternal tetap memerlukan sinkronisasi yang disengaja.