Boleh Ubah dan Tidak Boleh Ubah dalam Python
Artikel ini menerangkan mengenai boleh ubah dan tidak boleh ubah dalam Python.
YouTube Video
Boleh Ubah dan Tidak Boleh Ubah dalam Python
Boleh ubah dan tidak boleh ubah merujuk kepada keupayaan objek untuk berubah. Memahami perkara ini membantu dalam mengelakkan pepijat yang tidak dijangka dan pengurusan memori yang cekap.
Apakah Boleh Ubah?
Objek boleh ubah boleh menukar keadaan dalaman mereka selepas dicipta.
Jenis Data Boleh Ubah Utama
list
dict
set
- Kelas yang ditentukan pengguna (jika atributnya boleh diubah)
Contoh: Mengubah Senarai
1numbers = [1, 2, 3]
2numbers[0] = 100
3print(numbers) # [100, 2, 3]
Senarai adalah objek boleh ubah, dan elemen-elemennya boleh diubah dengan bebas.
Apakah Tidak Boleh Ubah?
Objek tidak boleh ubah tidak boleh diubah selepas ia dicipta. Cuba mengubahnya akan menghasilkan penciptaan objek baru.
Jenis Data Tidak Boleh Ubah Utama
int
float
str
tuple
bool
frozenset
Contoh: Mengubah String
1text = "hello"
2# text[0] = "H" # TypeError: 'str' object does not support item assignment
3
4text = "H" + text[1:] # Creates a new string
5print(text) # "Hello"
String adalah tidak boleh ubah, jadi anda tidak boleh mengubahnya secara sebahagian.
Perbandingan antara Boleh Ubah dan Tidak Boleh Ubah
1# Mutable example
2a = [1, 2, 3]
3b = a
4b[0] = 100
5print(a) # [100, 2, 3] -> a is also changed
6
7# Immutable example
8x = 10
9y = x
10y = 20
11print(x) # 10 -> x is unchanged
Seperti yang ditunjukkan dalam contoh di atas, objek boleh ubah dikongsi melalui rujukan, jadi mereka boleh mempengaruhi pembolehubah lain. Sebaliknya, objek yang tidak boleh diubah membuat contoh baru semasa pengagihan semula, meninggalkan nilai asal tidak terjejas.
Memeriksa Perilaku Dalaman Menggunakan id()
Dalam Python, anda boleh menggunakan fungsi id()
untuk memeriksa ID objek. ID objek adalah serupa dengan alamat memori.
1# Immutable int behavior
2a = 10
3print(id(a)) # e.g., 140715920176592
4a += 1
5print(id(a)) # e.g., 140715920176624 -> ID has changed
6
7# Mutable list behavior
8b = [1, 2, 3]
9print(id(b)) # e.g., 2819127951552
10b.append(4)
11print(id(b)) # Same ID -> only the content has changed
Seperti yang ditunjukkan, objek baru dicipta untuk jenis tidak boleh ubah, manakala jenis boleh ubah diubah di tempat.
Fungsi dan Amaran dengan Objek yang Boleh Diubah dan Tidak Boleh Diubah
Apabila luluskan objek yang boleh diubah kepada fungsi, data asal mungkin diubah.
Contoh: Fungsi yang Mengubah Senarai
1def modify_list(lst):
2 lst.append(100)
3
4my_list = [1, 2, 3]
5modify_list(my_list)
6print(my_list) # [1, 2, 3, 100]
Contoh: Fungsi yang Mengubah Nombor
Sebaliknya, cuba untuk mengubah objek yang tidak boleh diubah mengakibatkan pembuatan objek baru.
1def modify_number(n):
2 n += 10
3
4my_number = 5
5modify_number(my_number)
6print(my_number) # 5 -> unchanged
Pertimbangan Praktikal
Elakkan Menggunakan Objek yang Boleh Diubah sebagai Argumen Lalai
1# Bad example
2def add_item(item, container=[]):
3 container.append(item)
4 return container
5
6print(add_item(1)) # [1]
7print(add_item(2)) # [1, 2] -> unintended behavior
8
9# Good example
10def add_item(item, container=None):
11 if container is None:
12 container = []
13 container.append(item)
14 return container
Oleh kerana argumen lalai hanya dinilai sekali sahaja semasa definisi fungsi, menggunakan objek yang boleh diubah boleh menyebabkan kesan sampingan yang tidak dijangka.
Ringkasan
Untuk memahami secara mendalam pembolehubah dan jenis data Python, adalah penting untuk memahami perbezaan antara yang boleh diubah dan tidak boleh diubah. Memahami ciri-ciri ini membantu anda mengelakkan tingkah laku yang tidak disengajakan dalam kod anda dan menulis program yang lebih teguh dan mudah dibaca.
Anda boleh mengikuti artikel di atas menggunakan Visual Studio Code di saluran YouTube kami. Sila lihat juga saluran YouTube kami.