Kebijaksanaan standar adalah bahwa string Python tidak dapat diubah. Anda tidak dapat mengubah nilai string, hanya referensi ke string. Seperti itu
x = "hello" x = "goodbye" # New string!Yang menyiratkan bahwa setiap kali Anda membuat perubahan pada variabel string, Anda sebenarnya menghasilkan string baru. Karena itu, tutorial di luar sana memperingatkan Anda untuk menghindari rangkaian string di dalam loop dan menyarankan untuk menggunakan join sebagai gantinya untuk alasan kinerja. Bahkan dokumentasi resmi mengatakan demikian
Ini salah. Semacam
Ada kasus umum ketika string dalam Python sebenarnya bisa berubah. Saya akan menunjukkan kepada Anda sebuah contoh dengan memeriksa ID unik objek string menggunakan fungsi id() bawaan, yang hanya merupakan alamat memori. Jumlahnya berbeda untuk setiap objek. (Objek dapat dibagikan, seperti dengan magang. )
Saya menggabungkan dua string tetapi alamat memori tidak berubah
Untuk pemeriksaan kewarasan tambahan, mari buat "penunjuk" kita sendiri dan lihat apakah itu menunjuk ke string asli atau yang dimodifikasi
Jika string benar-benar tidak dapat diubah, maka alamat yang kami simpan di b akan mengarah ke string asli. Namun, kami melihat bahwa string yang dicetak setara
Kita dapat mencoba pengujian lain untuk melihat seberapa sering kita mendapatkan objek string baru dengan melakukan 10.000 penggabungan kecil
Hanya 46 dari 10.000 rangkaian yang mengalokasikan string baru
Jadi apa yang terjadi di sini?
CPython pintar. Jika tidak ada referensi lain ke string, maka string akan mencoba untuk memutasikan string alih-alih mengalokasikan yang baru. Meskipun terkadang perlu mengubah ukuran buffer jika string menjadi terlalu besar, seperti vektor C++ atau Daftar C#
Kita bisa melihat petunjuk pertama dalam kode untuk ini di file CPython. Ia mencoba mengurangi jumlah referensi menjadi 1 jika memungkinkan saat melakukan penggabungan string
Sekarang lihat PyUnicode_Append() di. Jika string dapat dimodifikasi (hanya memiliki 1 referensi dan tidak diinternir), maka string akan mencoba menambahkan di tempatnya. unicode_resize() akan melihat apakah itu cocok atau jika alokasi baru perlu dibuat
Itu dia. Bukti bahwa Anda dapat mengubah string dengan Python
Apakah ini benar-benar dianggap sebagai mutabilitas? . String akan tetap dibuang jadi ini hanya pengoptimalan untuk menggunakan kembali memori. Hal penting yang dapat diambil di sini adalah Anda tidak mengalokasikan string baru setiap saat seperti yang dikatakan internet
Bisa berubah adalah cara mewah untuk mengatakan bahwa keadaan internal objek diubah/bermutasi. Jadi, definisi paling sederhana adalah. Objek yang keadaan internalnya dapat diubah dapat diubah. Di sisi lain, immutable tidak mengizinkan perubahan apa pun pada objek setelah dibuat
Kedua status ini merupakan bagian integral dari struktur data Python. Jika Anda ingin menjadi lebih berpengetahuan tentang seluruh Struktur Data Python, ikuti kursus gratis ini yang mencakup banyak struktur data dalam Python termasuk struktur data tuple yang tidak dapat diubah. Anda juga akan menerima sertifikat pada penyelesaian yang pasti akan menambah nilai portofolio Anda
Definisi yang Dapat Diubah
Bisa berubah adalah ketika sesuatu dapat diubah atau memiliki kemampuan untuk berubah. Dalam Python, 'bisa berubah' adalah kemampuan objek untuk mengubah nilainya. Ini sering merupakan objek yang menyimpan kumpulan data
Definisi yang tidak berubah
Abadi adalah ketika tidak ada perubahan yang mungkin dari waktu ke waktu. Dalam Python, jika nilai suatu objek tidak dapat diubah dari waktu ke waktu, maka itu dikenal sebagai tidak dapat diubah. Setelah dibuat, nilai objek ini bersifat permanen
Daftar objek yang Dapat Diubah dan Tidak Dapat Diubah
Objek tipe bawaan yang bisa berubah adalah
- Daftar
- Set
- Kamus
- Kelas yang Ditentukan Pengguna (Ini murni tergantung pada pengguna untuk menentukan karakteristik)
Objek tipe bawaan yang tidak dapat diubah adalah
- Bilangan (Integer, Rasional, Float, Desimal, Kompleks & Boolean)
- String
- Tupel
- Set Beku
- Kelas yang Ditentukan Pengguna (Ini murni tergantung pada pengguna untuk menentukan karakteristik)
Mutabilitas objek adalah salah satu karakteristik yang membuat Python menjadi bahasa yang diketik secara dinamis. Meskipun Mutable dan Immutable dalam Python adalah konsep yang sangat mendasar, kadang-kadang bisa sedikit membingungkan karena sifat intransitif dari kekekalan.
Objek dengan Python
Dalam Python, semuanya diperlakukan sebagai objek. Setiap objek memiliki tiga atribut ini
- Identitas – Ini mengacu pada alamat yang dirujuk objek dalam memori komputer
- Type – Ini mengacu pada jenis objek yang dibuat. Misalnya- bilangan bulat, daftar, string dll.
- Nilai – Ini mengacu pada nilai yang disimpan oleh objek. Misalnya – List=[1,2,3] akan menampung angka 1,2 dan 3
Meskipun ID dan Jenis tidak dapat diubah setelah dibuat, nilai dapat diubah untuk objek yang Dapat Diubah
Lihat kursus sertifikat python gratis ini untuk memulai dengan Python
Objek yang Dapat Diubah dengan Python
Saya percaya, daripada mendalami aspek teori bisa berubah dan tidak berubah dalam Python, kode sederhana akan menjadi cara terbaik untuk menggambarkan apa artinya dalam Python. Oleh karena itu, mari kita bahas kode di bawah ini langkah demi langkah
#Membuat daftar yang berisi nama kota di India
cities = [‘Delhi’, ‘Mumbai’, ‘Kolkata’] _# Mencetak elemen dari daftar kota, dipisahkan dengan koma dan spasi
for city in cities: print(city, end=’, ’) Output [1]: Delhi, Mumbai, Kolkata#Mencetak lokasi objek yang dibuat di alamat memori dalam format heksadesimal
print(hex(id(cities))) Output [2]: 0x1691d7de8c8#Menambahkan kota baru ke daftar kota
cities.append(‘Chennai’) _#Mencetak elemen dari daftar kota, dipisahkan dengan koma dan spasi
for city in cities: print(city, end=’, ’) Output [3]: Delhi, Mumbai, Kolkata, Chennai#Mencetak lokasi objek yang dibuat di alamat memori dalam format heksadesimal
print(hex(id(cities))) Output [4]: 0x1691d7de8c8 _Contoh di atas menunjukkan kepada kita bahwa kita dapat mengubah keadaan internal 'kota' objek dengan menambahkan satu kota lagi 'Chennai' ke dalamnya, namun alamat memori objek tidak berubah. Ini menegaskan bahwa kami tidak membuat objek baru, melainkan objek yang sama telah diubah atau dimutasi. Karenanya, kita dapat mengatakan bahwa objek yang merupakan jenis daftar dengan nama variabel referensi 'kota' adalah OBJEK YANG DAPAT DIUBAH
Sekarang mari kita bahas istilah IMMUTABLE. Mempertimbangkan bahwa kami memahami apa kepanjangan dari yang dapat diubah, jelas bahwa definisi dari yang tidak dapat diubah akan menyertakan 'TIDAK' di dalamnya. Berikut adalah definisi paling sederhana dari kekekalan– Sebuah objek yang keadaan internalnya TIDAK dapat diubah adalah KEKENALAN
Sekali lagi, jika Anda mencoba dan berkonsentrasi pada pesan kesalahan yang berbeda, Anda temui, dilemparkan oleh masing-masing IDE; . Misalnya, pertimbangkan kode di bawah ini & pesan kesalahan yang terkait dengannya, saat mencoba mengubah nilai Tuple pada indeks 0.
#Membuat Tuple dengan nama variabel 'foo'
foo = (1, 2)#Mengubah nilai indeks[0] dari 1 menjadi 3
foo[0] = 3 TypeError: 'tuple' object does not support item assignment _Objek Abadi dengan Python
Sekali lagi, kode sederhana akan menjadi cara terbaik untuk menggambarkan arti dari kekekalan. Oleh karena itu, mari kita bahas kode di bawah ini langkah demi langkah
#Membuat Tuple yang berisi nama hari kerja bahasa Inggris
weekdays = ‘Sunday’, ‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’ _# Mencetak elemen tuple hari kerja
print(weekdays) Output [1]: (‘Sunday’, ‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’)#Mencetak lokasi objek yang dibuat di alamat memori dalam format heksadesimal
for city in cities: print(city, end=’, ’) Output [1]: Delhi, Mumbai, Kolkata 0#tuple tidak dapat diubah, jadi Anda tidak dapat menambahkan elemen baru, oleh karena itu, gunakan penggabungan tupel dengan operator # + untuk menambahkan hari imajiner baru di tuple 'hari kerja'
for city in cities: print(city, end=’, ’) Output [1]: Delhi, Mumbai, Kolkata 1#Mencetak elemen tuple hari kerja
for city in cities: print(city, end=’, ’) Output [1]: Delhi, Mumbai, Kolkata 2#Mencetak lokasi objek yang dibuat di alamat memori dalam format heksadesimal
Contoh di atas menunjukkan bahwa kami dapat menggunakan nama variabel yang sama yang mereferensikan objek yang merupakan jenis tupel dengan tujuh elemen di dalamnya. Namun, ID atau lokasi memori tuple lama & baru tidak sama. Kami tidak dapat mengubah status internal objek 'hari kerja'. Manajer program Python membuat objek baru di alamat memori dan nama variabel 'hari kerja' mulai mereferensikan objek baru dengan delapan elemen di dalamnya. Oleh karena itu, kita dapat mengatakan bahwa objek yang merupakan jenis tuple dengan nama variabel referensi 'hari kerja' adalah OBJEK TETAP
Baca juga. Memahami Exploratory Data Analysis (EDA) dengan Python
Di mana Anda bisa menggunakan objek yang bisa berubah dan tidak berubah
Objek yang dapat diubah dapat digunakan di mana Anda ingin mengizinkan pembaruan apa pun. Misalnya, Anda memiliki daftar nama karyawan di organisasi Anda, dan perlu diperbarui setiap kali ada anggota baru yang direkrut. Anda dapat membuat daftar yang dapat berubah, dan dapat diperbarui dengan mudah
Kekekalan menawarkan banyak aplikasi berguna untuk berbagai tugas sensitif yang kami lakukan di lingkungan yang berpusat pada jaringan tempat kami mengizinkan pemrosesan paralel. Dengan membuat objek yang tidak dapat diubah, Anda menyegel nilai dan memastikan bahwa tidak ada utas yang dapat meminta penimpaan/pembaruan ke data Anda. Ini juga berguna dalam situasi di mana Anda ingin menulis kode yang tidak dapat dimodifikasi. Misalnya, kode debug yang mencoba menemukan nilai objek yang tidak dapat diubah
Hati-hati. Sifat Kekekalan yang tidak transitif
OKE. Sekarang kita mengerti apa itu objek yang bisa berubah & tidak berubah di Python. Mari kita lanjutkan dan diskusikan kombinasi keduanya dan jelajahi kemungkinannya. Mari kita bahas, bagaimana perilakunya jika Anda memiliki objek yang tidak dapat diubah yang berisi objek yang dapat diubah?
#membuat Tuple (objek tidak berubah) yang berisi 2 daftar (dapat diubah) sebagai elemennya
#Elemen (daftar) berisi nama, umur & jenis kelamin
for city in cities: print(city, end=’, ’) Output [1]: Delhi, Mumbai, Kolkata _4#mencetak tuple
for city in cities: print(city, end=’, ’) Output [1]: Delhi, Mumbai, Kolkata 5#mencetak lokasi objek yang dibuat di alamat memori dalam format heksadesimal
for city in cities: print(city, end=’, ’) Output [1]: Delhi, Mumbai, Kolkata 6#Mengubah usia untuk elemen ke-1. Memilih elemen pertama tuple dengan menggunakan pengindeksan [0] lalu elemen ke-2 dari daftar dengan menggunakan pengindeksan [1] dan menetapkan nilai baru untuk usia sebagai 4
for city in cities: print(city, end=’, ’) Output [1]: Delhi, Mumbai, Kolkata 7#mencetak tuple yang diperbarui
for city in cities: print(city, end=’, ’) Output [1]: Delhi, Mumbai, Kolkata _8#mencetak lokasi objek yang dibuat di alamat memori dalam format heksadesimal
for city in cities: print(city, end=’, ’) Output [1]: Delhi, Mumbai, Kolkata _9Pada kode di atas, Anda dapat melihat bahwa objek 'orang' tidak dapat diubah karena merupakan jenis tupel. Namun, ia memiliki dua daftar sebagai elemennya, dan kami dapat mengubah status daftar (daftar dapat diubah). Jadi, di sini kita tidak mengubah referensi objek di dalam Tuple, tetapi objek yang direferensikan dimutasi
Baca juga. Deteksi Objek Real-Time Menggunakan TensorFlow
Dengan cara yang sama, mari jelajahi bagaimana perilakunya jika Anda memiliki objek yang dapat diubah yang berisi objek yang tidak dapat diubah?
#membuat daftar (objek yang dapat diubah) yang berisi tupel (tidak dapat diubah) sebagai elemennya
print(hex(id(cities))) Output [2]: 0x1691d7de8c8 0#mencetak daftar
print(hex(id(cities))) Output [2]: 0x1691d7de8c8 1#mencetak lokasi objek yang dibuat di alamat memori dalam format heksadesimal
print(hex(id(cities))) Output [2]: 0x1691d7de8c8 2#mengubah referensi objek pada indeks 0
print(hex(id(cities))) Output [2]: 0x1691d7de8c8 _3#mencetak daftar
#mencetak lokasi objek yang dibuat di alamat memori dalam format heksadesimal
print(hex(id(cities))) Output [2]: 0x1691d7de8c8 5Sebagai seorang individu, itu sepenuhnya tergantung pada Anda dan kebutuhan Anda untuk struktur data seperti apa yang ingin Anda buat dengan kombinasi objek yang dapat diubah & tidak dapat diubah. Saya harap informasi ini akan membantu Anda saat memutuskan jenis objek yang ingin Anda pilih untuk selanjutnya
Sebelum saya mengakhiri pembahasan kita tentang IMMUTABILITY, izinkan saya untuk menggunakan kata 'CAVITE' ketika kita membahas String dan Integer. Ada pengecualian, dan Anda mungkin melihat beberapa hasil yang mengejutkan saat memeriksa kebenaran untuk kekekalan. Contohnya
#membuat objek bertipe integer dengan nilai 10 dan nama variabel referensi 'x'
x = 10
#mencetak nilai 'x'
print(hex(id(cities))) Output [2]: 0x1691d7de8c8 6#Mencetak lokasi objek yang dibuat di alamat memori dalam format heksadesimal
print(hex(id(cities))) Output [2]: 0x1691d7de8c8 _7#membuat objek bertipe integer dengan nilai 10 dan nama variabel referensi 'y'
print(hex(id(cities))) Output [2]: 0x1691d7de8c8 8#mencetak nilai 'y'
print(hex(id(cities))) Output [2]: 0x1691d7de8c8 _9#Mencetak lokasi objek yang dibuat di alamat memori dalam format heksadesimal
cities.append(‘Chennai’) _0Sesuai dengan pembahasan dan pemahaman kita, sejauh ini, alamat memori untuk x & y seharusnya berbeda, karena 10 adalah instance dari kelas Integer yang tidak dapat diubah. Namun, seperti yang ditunjukkan pada kode di atas, ia memiliki alamat memori yang sama. Ini bukan sesuatu yang kami harapkan. Tampaknya apa yang telah kita pahami dan diskusikan, memiliki pengecualian juga
Pemeriksaan cepat – Struktur Data Python
Kekekalan Tuple
Tuple tidak dapat diubah dan karenanya tidak dapat memiliki perubahan apa pun di dalamnya setelah dibuat dengan Python. Ini karena mereka mendukung operasi urutan yang sama dengan string. Kita semua tahu bahwa string tidak dapat diubah. Operator indeks akan memilih elemen dari tuple seperti pada string. Oleh karena itu, mereka tidak berubah
Pengecualian dalam kekekalan
Seperti semua, ada juga pengecualian dalam kekekalan di python. Tidak semua objek yang tidak dapat diubah benar-benar dapat berubah. Ini akan menimbulkan banyak keraguan di benak Anda. Mari kita ambil contoh untuk memahami hal ini
Pertimbangkan tuple 'tup'
Sekarang, jika kita mempertimbangkan tuple tup = ('GreatLearning',[4,3,1,2]) ;
Kami melihat bahwa tuple memiliki elemen tipe data yang berbeda. Elemen pertama di sini adalah string yang seperti yang kita semua tahu sifatnya tidak dapat diubah. Elemen kedua adalah daftar yang kita semua tahu bisa berubah. Sekarang, kita semua tahu bahwa tuple itu sendiri adalah tipe data yang tidak dapat diubah. Itu tidak dapat mengubah isinya. Tapi, daftar di dalamnya bisa berubah isinya. Jadi, nilai objek yang tidak dapat diubah tidak dapat diubah tetapi objek penyusunnya bisa. mengubah nilainya
FAQ
1. Perbedaan antara bisa berubah vs tidak berubah dengan Python?
ObjectImmutable ObjectState dari objek dapat dimodifikasi setelah dibuat. Status objek tidak dapat diubah setelah dibuat. Mereka tidak aman. Mereka adalah kelas thread safeMutable yang belum final. Penting untuk membuat kelas final sebelum membuat objek yang tidak dapat diubah2. Apa tipe data yang bisa berubah dan tidak berubah di Python?
- Beberapa tipe data yang bisa berubah di Python adalah
daftar, kamus, set, kelas yang ditentukan pengguna
- Beberapa tipe data yang tidak dapat diubah adalah.
int, float, desimal, bool, string, tuple, range
3. Apakah daftar bisa berubah dengan Python?
Daftar dalam Python adalah tipe data yang dapat berubah karena elemen daftar dapat dimodifikasi, elemen individual dapat diganti, dan urutan elemen dapat diubah bahkan setelah daftar dibuat
(Contoh terkait daftar telah dibahas sebelumnya di blog ini. )
4. Mengapa tuple disebut tipe yang tidak dapat diubah?
Struktur data tupel dan daftar sangat mirip, tetapi satu perbedaan besar antara tipe data adalah bahwa daftar dapat berubah, sedangkan tupel tidak dapat diubah. Alasan ketidakberubahan tuple adalah setelah elemen ditambahkan ke tuple dan tuple telah dibuat;
Seorang programmer akan selalu lebih suka membuat kode yang dapat digunakan kembali daripada membuat seluruh objek data lagi. Tetap saja, meskipun tupel tidak dapat diubah, seperti daftar, tuple dapat berisi objek Python apa pun, termasuk objek yang dapat diubah
5. Apakah set bisa berubah dengan Python?
Himpunan adalah kumpulan tipe data yang tidak terurut yang dapat digunakan untuk melakukan operasi matematika (seperti penyatuan, persimpangan, perbedaan, dll. ). Setiap elemen dalam suatu himpunan adalah unik dan tidak dapat diubah, mis. e. tidak boleh ada nilai duplikat, dan nilai tidak dapat diubah. Namun, kami dapat menambah atau menghapus item dari set karena set itu sendiri dapat berubah
6. Apakah string bisa berubah dengan Python?
String tidak dapat diubah dengan Python. String adalah tipe data yang tidak dapat diubah yang artinya nilainya tidak dapat diperbarui